从DB2表中选择并插入到SQL表中

时间:2009-04-24 15:14:51

标签: c# .net sql db2

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

我有一个.Net C#项目在工作中根据他们必须遵守的公司标准验证某些表。这些表可以在SQL Server或DB2上。当一个表最初添加到程序中时,我使用information_schema.columns为sql的select语句或db2的syscat.columns来收集有关该表的元数据/信息。获得该数据后,我将其存储在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表信息保存到数据表中,但是你可以直接对数据表运行查询吗?

谢谢, 莱恩

3 个答案:

答案 0 :(得分:1)

您是否考虑过使用SSIS,而不是编写应用程序来进行操作?

答案 1 :(得分:1)

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

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();

答案 2 :(得分:1)

您可能想要使用SqlBulkCopy: MSDN

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