Avatar billede Driton Seniormester
06. januar 2016 - 11:58 Der er 3 kommentarer og
1 løsning

Generere en sql script

Jeg sad og tænkte om det var muligt, at genere en sql script via en knap. Hvor man hentede sine data fra databasen alt fra en database til et enkelt tabel?

Hvis muligt, kan man rette mig mod et eksempel?

Sad og søgte på google uden held
Avatar billede jakobdo Ekspert
06. januar 2016 - 14:19 #1
Kunne du måske komme med eksempel på hvordan data skulle se ud ?

Tænker du noget ala:

database1
tabel1
data, data, data, data
data1, data1, data1, data1

tabel2
data, data, data
data1, data1, data1

eller hvad ønsker du ?

Med lidt flere input, tror jeg andre bedre kan byde ind med hvad du ønsker af løsning. :)
Avatar billede arne_v Ekspert
06. januar 2016 - 15:06 #2
Noget a la dette?


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.IO;
using System.Text;

namespace E
{
    public class DbDump
    {
        public delegate bool SelectDb(string db);
        public delegate bool SelectTbl(string db, string tbl);
        public delegate bool SelectFld(string db, string tbl,string fld);
        public static void DumpTbl(IDbConnection con, string db, string tbl, StreamWriter sw, SelectFld selfld)
        {
            IDbCommand cmd = con.CreateCommand();
            cmd.CommandText = "USE " + db;
            cmd.ExecuteNonQuery();
            cmd.CommandText = "SELECT * FROM " + tbl;
            List<string> alltbl = new List<string>();
            IDataReader rdr = cmd.ExecuteReader();
            while(rdr.Read())
            {
                string flds = "";
                string vals = "";
                for(int i = 0; i < rdr.FieldCount; i++)
                {
                    if(selfld(db, tbl, rdr.GetName(i)))
                    {
                        if(i > 0)
                        {
                            flds += ",";
                            vals += ",";
                        }
                        flds += rdr.GetName(i);
                        object o = rdr.GetValue(i);
                        if(o is DBNull)
                        {
                            sw.Write("NULL");
                        }
                        else if(o is int
                                || o is long
                                || o is float
                                || o is bool
                                || o is double
                                || o is decimal)
                        {
                            vals += o.ToString();
                        }
                        else if(o is string)
                        {
                            vals += ("'" + o.ToString().Replace("'", "''") + "'");
                        }
                        else
                        {
                            throw new ApplicationException("Unsupported data type");
                        }
                    }
                }
                sw.WriteLine("INSERT INTO {0}({1}) VALUES({2});", tbl, flds, vals);
            }
            rdr.Close();
        }
        public static void DumpDb(IDbConnection con, string db, string catsuf, StreamWriter sw, SelectTbl seltbl, SelectFld selfld)
        {
            sw.WriteLine("USE {0};", db);
            IDbCommand cmd = con.CreateCommand();
            cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_" + catsuf + "='" + db + "' AND TABLE_TYPE='BASE TABLE'";
            List<string> alltbl = new List<string>();
            IDataReader rdr = cmd.ExecuteReader();
            while(rdr.Read())
            {
                string tbl = (string)rdr[0];
                if(seltbl(db, tbl))
                {
                    alltbl.Add(tbl);
                }
            }
            rdr.Close();
            foreach(string tbl in alltbl)
            {
                DumpTbl(con, db, tbl, sw, selfld);
            }
        }
        public static void Dump(IDbConnection con, string catsuf, StreamWriter sw, SelectDb seldb, SelectTbl seltbl, SelectFld selfld)
        {
            IDbCommand cmd = con.CreateCommand();
            cmd.CommandText = "SELECT DISTINCT TABLE_" + catsuf + " FROM INFORMATION_SCHEMA.TABLES";
            List<string> alldb = new List<string>();
            IDataReader rdr = cmd.ExecuteReader();
            while(rdr.Read())
            {
                string db = (string)rdr[0];
                if(!db.StartsWith("sys") && !db.Equals("mysql") && seldb(db))
                {
                    alldb.Add(db);
                }
            }
            rdr.Close();
            foreach(string db in alldb)
            {
                DumpDb(con, db, catsuf, sw, seltbl, selfld);
            }
        }
        public static void Dump(string provider, string constr, string catsuf, string fnm, SelectDb seldb, SelectTbl seltbl, SelectFld selfld)
        {
            DbProviderFactory dbf = DbProviderFactories.GetFactory(provider);
            using(IDbConnection con = dbf.CreateConnection())
            {
                con.ConnectionString = constr;
                con.Open();
                using(StreamWriter sw = new StreamWriter(fnm, false, Encoding.UTF8))
                {
                    Dump(con, catsuf, sw, seldb, seltbl, selfld);
                }
            }
        }
        public static void Dump(string provider, string constr, string catsuf, string fnm)
        {
            Dump(provider, constr, catsuf, fnm, (db) => true, (db, tbl) => true, (db, tbl, fld) => true);
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            DbDump.Dump("System.Data.SqlClient", @"Server=ARNEPC4\SQLEXPRESS;Integrated Security=SSPI;Database=Test", "CATALOG", @"C:\work\ss.txt");
            DbDump.Dump("MySql.Data.MySqlClient", "Data Source=localhost;Database=Test;User Id=root;Password=", "SCHEMA", @"C:\work\ms.txt");
            DbDump.Dump("System.Data.SqlClient", @"Server=ARNEPC4\SQLEXPRESS;Integrated Security=SSPI;Database=Test", "CATALOG", @"C:\work\ss2.txt", (db) => db == "test", (db, tbl) => true, (db, tbl, fld) => fld != "f2");
        }
    }
}
Avatar billede Driton Seniormester
06. januar 2016 - 18:29 #3
Ja arne, det var lige sådan noget jeg lede efter. Kan du lige smide et svar
Avatar billede arne_v Ekspert
06. januar 2016 - 18:44 #4
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester