在数据库管理中,自动化脚本的生成是一个常见的需求。本文将介绍一个用C#编写的SQL脚本生成器,它能够根据数据库表生成插入和更新的SQL脚本。这个工具特别适用于需要将数据从一个数据库迁移到另一个数据库的场景,或者在进行数据同步时需要批量生成SQL操作语句的情况。
SQL脚本生成器可以从各种数据库系统(如SQL Server, MS Access, FoxPro, MySql等)中提取数据,并生成相应的SQL脚本。这个工具目前只支持插入(Insert)和更新(Update)操作的脚本生成,并不包含删除(Delete)操作。如果需要,用户可以根据自己的需求进行相应的修改。
要使用这个SQL脚本生成器,首先需要引入必要的命名空间:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Windows;
using System.Windows.Forms;
using System.Collections;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Nmo;
using Microsoft.SqlServer.Management.Smo.Agent;
然后,创建一个名为SQLScriptGenerater
的类,这个类负责生成SQL脚本。
这个类包含了生成SQL脚本所需的各种方法和变量。例如,它有一个方法GetprimaryKey(string tableName)
,用于获取表的主键名称。这个方法使用了SQL Server的默认存储过程sp_pkeys
,只需要传入表名即可返回主键列。
在Run(string cnString)
方法中,首先会从数据库中读取数据,然后根据读取的数据生成插入和更新的SQL脚本。这个过程涉及到对数据的遍历,以及对每个字段的处理。
插入查询和更新查询的生成是通过InsertQuery
和UpdateQuery
方法实现的。这两个方法分别用于生成插入和更新的SQL语句。
以下是使用这个类生成SQL脚本的示例代码:
public void Run(string cnString)
{
string values, IDValues = "";
string insqry, upqry;
int i = 0;
SqlDataReader myReader;
SqlConnection mySqlConnection = new SqlConnection(cnString);
SqlCommand mySqlCommand = new SqlCommand("select * from Tab", mySqlConnection);
TableName = "Tab";
primaryKey = GetprimaryKey(TableName);
insqry = "";
mySqlConnection.Open();
myReader = mySqlCommand.ExecuteReader();
if (myReader != null)
{
while (myReader.Read())
{
i = i + 1;
updateAdd = "";
insqry = "";
string celldata = "", coulmenName = "";
for (int j = 0; j < myReader.FieldCount; j++)
{
if (j > 0)
{
coulmenName += "," + myReader.GetName(j).ToString();
celldata += ",'" + myReader[j].ToString() + "'";
}
else
{
coulmenName += myReader.GetName(j).ToString();
celldata += "'" + myReader[j].ToString() + "'";
}
if (primaryKey == myReader.GetName(j).ToString())
{
IDValues = myReader[j].ToString();
}
}
if (IDValues != null)
{
upqry = UpdateQuery(coulmenName, celldata, primaryKey, IDValues);
insqry = InsertQuery(coulmenName, celldata, DesTableName);
}
WriteScripts(DesTableName, insqry, upqry, IDValues, primaryKey, i);
}
MessageBox.Show("Total number of record in database are=" + i);
}
}