【问题标题】:Select from a DB2 table and insert to a SQL table从 DB2 表中选择并插入到 SQL 表中
【发布时间】:2009-04-24 15:14:50
【问题描述】:

我觉得这可能是一个疯狂的问题,如果有人对如何做到这一点有更好的想法,请务必告诉我。

我有一个 .Net C# 项目正在工作,它根据他们必须遵守的公司标准来验证某些表。这些表可以在 SQL Server 或 DB2 上。最初将表添加到程序中时,我使用选择语句从information_schema.columns 用于 sql 或syscat.columns 用于 db2 收集有关表的元数据/信息。获得该数据后,我将其存储在 sql server 上的一个表中(我们称之为all_table_information),其中包含程序中验证的每个表的相同信息。

如果表是 SQL 表,我可以运行这个查询(当然限制它只包含我想要的表中的列):

insert into [all_table_information]
    (table_id, column_name, data_type, max_char_length)
select table_id, column_name, data_type, character_maximum_length
    from information_schema.columns 
    where ...restrict to needed table...

然后在 SqlCommand 中执行。但如果是 DB2 表,我必须运行这个查询(再次限制在我需要的列):

select tabschema, tabname, colname, typename, length 
from syscat.columns 
where ...restrict to needed table...

然后获取一个带有结果的 DataReader 并循环使用它插入每一行:

while (dr.Read())
{
   insert into [all_table_information]
   (table_id, column_name, data_type, max_char_length) values 
   (..."'" + dr["whatever"] + "', '" + ....)

   ...execute sql here...

} 
dr.Close();

这样做是可行的,但它很慢,所以我只是想知道是否有任何方法可以在一个语句中执行此操作?我知道您也可以将 db2 表信息保存到数据表中,但是您可以直接对数据表运行查询吗?

谢谢, 瑞恩

【问题讨论】:

    标签: c# .net sql db2


    【解决方案1】:

    您可能想要使用 SqlBulkCopy: MSDN

    这比为每一行单独插入要快得多。

    【讨论】:

    • 此类对其他数据库有限制:SqlBulkCopy 类只能用于将数据写入 SQL Server 表。
    • 是的,但我的理解是 Ryan 希望将其全部存储到 SQL Server 数据库表中,因此 SqlBulkCopy 对其使用有效。
    【解决方案2】:

    您是否考虑过使用 SSIS,而不是编写应用程序来实现它?

    【讨论】:

    • 你能从 .Net 中调用 SSIS 吗?列信息来自的表是由程序中的一系列组合框选择确定的。
    • 相信你可以 - 你当然可以使用 DTS 包“回到过去”
    【解决方案3】:

    最好在dr.Read() 之外创建SqlCommand 并使用参数。这将提高性能和安全性,并且您不必担心动态地正确形成语法。像这样……

    SqlCommand insertCommand = new SqlCommand(connection);
    
    insertCommand.CommandText = @"
    insert into [all_table_information]
    (table_id, column_name, data_type, max_char_length)
    values
    (@table_id, @column_name, @data_type, @max_char_length)";
    
    ...create your parameters and add them here
    
    insertCommand.Prepare(); //precompiles the query
    while (dr.Read())
    {
        ...set parameter values
    
        insertCommand.ExecuteNonQuery();
    } 
    dr.Close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多