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");
}
}
}