做了一个小工具,可以将 SQLSERVER 中的表、视图或者查询语句导出为Insert 语句。
如上图所示,你只要输入查询字符串,查询的SQL 语句 比如 select * from news
生成Insert 语句中的表名已经生成行数,点击 Build 就可以生成一个批量Insert 语句的文件。
代码
Database 类
using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;namespace BuildInsertSql{ class Database : IDisposable {SqlConnection _Conn;
SqlDataReader _DataReader;
DataTable _SchemaTable;
SqlCommand _Command;
public void Connect(string connectString)
{Close();
_Conn = new SqlConnection(connectString);_Conn.Open();
}
public void Close()
{Dispose();
}
public DataSet GetSchema(string queryString)
{ DataSet ds = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand(queryString, _Conn);
adapter.FillSchema(ds, SchemaType.Mapped);
return ds;}
public void OpenDataReader(string queryString)
{ _Command = new SqlCommand(queryString, _Conn);_SchemaTable = GetSchema(queryString).Tables[0];
_DataReader = _Command.ExecuteReader();
}
public void CloseDataReader()
{_DataReader.Close();
}
public void Clear()
{_SchemaTable.Clear();
}
public DataRow GetNextRow() { if (_DataReader.Read()) {DataRow row = _SchemaTable.NewRow();
foreach (DataColumn col in _SchemaTable.Columns)
{row[col.ColumnName] = _DataReader[col.ColumnName];
}
return row;}
else {return null;
}
}
~Database()
{Close();
}
#region IDisposable Memberspublic void Dispose()
{ try {if (_Conn != null)
{_Command.Cancel();
_DataReader.Close();
if (_Conn.State != ConnectionState.Closed &&_Conn.State != ConnectionState.Broken)
{_Conn.Close();
}
_Conn = null;}
}
catch {}
}
#endregion}
}
FromMain 类
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace BuildInsertSql{public partial class FormMain : Form
{ public FormMain() {InitializeComponent();
}
private string GetOneRowSql(DataSet schema, DataRow row, string tableName)
{ StringBuilder insertString = new StringBuilder(); insertString.AppendFormat("Insert {0} (", tableName); int i = 0;foreach (DataColumn col in schema.Tables[0].Columns)
{ if (i == 0) { insertString.AppendFormat("[{0}]", col.ColumnName);}
else { insertString.AppendFormat(", [{0}]", col.ColumnName);}
i++;
}
insertString.Append(") Values(");i = 0;
foreach (DataColumn col in schema.Tables[0].Columns)
{string value;
if (row[col.ColumnName] == DBNull.Value) {value = "NULL";
}
else {if (col.DataType == typeof(string))
{value = "'" + row[col.ColumnName].ToString().Replace("'", "''") + "'";
}
else if (col.DataType == typeof(DateTime))
{value = "'" + ((DateTime)(row[col.ColumnName])).ToString("yyyy-MM-dd HH:mm:ss") + "'";
}
else { value = row[col.ColumnName].ToString();}
}
if (i == 0) {insertString.AppendFormat("{0}", value);
}
else {insertString.AppendFormat(", {0}", value);
}
i++;
}
insertString.Append(");"); return insertString.ToString();}
private void buttonBuild_Click(object sender, EventArgs e)
{ try { if (saveFileDialogSql.ShowDialog() == DialogResult.OK) {using (Database db = new Database())
{db.Connect(textBoxConnectionString.Text);
DataSet ds = db.GetSchema(textBoxSQL.Text);
int totalRecords = int.MaxValue;
if (numericUpDownTotalRecords.Value > 0) { totalRecords = (int)numericUpDownTotalRecords.Value;}
db.OpenDataReader(textBoxSQL.Text);
DataRow row = db.GetNextRow();
using (System.IO.FileStream fs = new System.IO.FileStream(saveFileDialogSql.FileName, System.IO.FileMode.Create,
System.IO.FileAccess.ReadWrite))
{using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, Encoding.UTF8))
{ int current = 0;while (row != null && totalRecords > 0)
{totalRecords--;
string line = GetOneRowSql(ds, row, textBoxTableName.Text);db.Clear();
sw.WriteLine(line);
current++;
labelCurrent.Text = current.ToString();
Application.DoEvents();
row = db.GetNextRow();
}
}
}
}
MessageBox.Show("Build Successful!");}
}
catch (Exception e1) { MessageBox.Show(e1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
}
}