65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 2.0 生成插入脚本

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (4投票s)

2007 年 7 月 23 日

CPOL

2分钟阅读

viewsIcon

37674

downloadIcon

936

使用 .NET 2.0 获取 SQL Server 架构并生成插入语句。

Screenshot - Preview.jpg

引言

最近,我需要修改 SQL Server 中的一些数据并将它们插入到其他数据库中。方法是从源数据库获取数据,在网格中修改它们,并从网格生成 Insert 语句以供以后使用。

背景

.NET 2.0 中获取 SQL Server 架构的功能非常有用且易于使用。如果您能获取架构,生成脚本的任务将变得非常容易。

使用代码

以下是如何获取 SQL Server 实例

DataTable table = System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources();
DataView view = new DataView(table, string.Empty, 
                    "ServerName", DataViewRowState.Added);
cbx_ServerList.DataSource = view;
cbx_ServerList.DisplayMember = "ServerName"; 

要获取 SQL Server 数据库列表

DataTable table = conn.GetSchema(SqlClientMetaDataCollectionNames.Databases);
cbx_DatabaseList.DataSource = table;
cbx_DatabaseList.DisplayMember = "database_name";

要获取表列表

DataTable table = conn.GetSchema(SqlClientMetaDataCollectionNames.Tables, 
                  new string[] { null, null, null, "BASE TABLE" });
cbx_TableList.DataSource = table;
cbx_TableList.DisplayMember = "TABLE_NAME";

要获取视图列表

DataTable table = conn.GetSchema(SqlClientMetaDataCollectionNames.Tables, 
                  new string[] { null, null, null, "VIEW" });
cbx_ViewList.DataSource = table;
cbx_ViewList.DisplayMember = "TABLE_NAME"; 

要获取列列表(忽略了一些类型,因为我实际上不需要导出这些类型;而且,将图像导出到文本文件看起来很奇怪,对吧?)

private const string FILTER_COLUMN_TYPE = 
        "data_type NOT IN ('uniqueidentifier', 'timestamp', 'image')";  
DataTable columnsTable = conn.GetSchema(SqlClientMetaDataCollectionNames.Columns, 
                                        new string[] { null, null, tableName });
DataView columnsView = new DataView(columnsTable, FILTER_COLUMN_TYPE, 
                           "ordinal_position", DataViewRowState.Added); 

脚本生成

private static string GenerateDataRowInsertSQLScript(string SQLTableName, 
                      DataRow row, ArrayList includedColumnNames)
{
    StringBuilder builder = new StringBuilder();
    builder.Append(" INSERT INTO [").Append(SQLTableName).Append("] ( ");
    for (int cnt = 0; cnt < includedColumnNames.Count; cnt++)
    {
        if (cnt != 0)
            builder.Append(", ");
        builder.Append("[").Append(includedColumnNames[cnt].ToString()).Append("]");
    }
    builder.Append(" ) ").Append(Environment.NewLine);

    builder.Append(" VALUES ( ");
    for (int cnt = 0; cnt < includedColumnNames.Count; cnt++)
    {
        if (cnt != 0)
            builder.Append(", ");

        string columnName = includedColumnNames[cnt].ToString();
        builder.Append(SqlHelper.ToSQLString(row[columnName], 
                       row.Table.Columns[columnName].DataType));
    }
    builder.Append(" ) ").Append(Environment.NewLine).Append(Environment.NewLine);

    return builder.ToString();
}

演示

输入连接详细信息,并选择相应的表。

Screenshot - Login.jpg

“选择脚本”按钮将生成一个 SELECT 语句;这只是为了方便。您也可以在之后添加一个 WHERE 子句。

Screenshot - SelectStatement.jpg

按下“执行”按钮,您将在网格中获得结果数据集。

Screenshot - OriginalData.jpg

您可以根据需要修改数据。通过选择列,如果您愿意,可以在网格中执行重新排序或替换功能。

Screenshot - ModifiedData.jpg

按下“预览”按钮以获取插入脚本。

Screenshot - Preview.jpg

结论

这只是一个简单的项目,向您展示了如何使用 .NET 2.0 从 SQL Server 获取架构。

请注意,由于我没有捕获您在“选择脚本”框中输入的内容,并且仅通过查看返回的数据集,我不知道表名是什么,因此在生成插入脚本之前,您需要选择正确的表名。

© . All rights reserved.