2009-04-24 84 views
0

我觉得这可能是一个疯狂的问题,如果任何人有更好的想法如何做到这一点,请通过任何方式告诉我。从DB2表中选择并插入到SQL表中

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

如果表是一个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表信息保存到数据表中,但是可以直接对数据表运行查询吗?

感谢, 瑞安

回答

1

你可能想使用SqlBulkCopy的: MSDN

它比做单个刀片的每一行快得多。

1

你有没有使用SSIS,而不是写一个应用程序做考虑?

+0

你可以从.net内部调用SSIS吗?列信息来自的表格由程序内的一系列组合框选择确定。 – ryanulit 2009-04-24 15:24:32

+0

相信你可以 - 你当然可以用DTS包“回到当天” – 2009-04-25 09:16:39

1

您最好在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(); 
相关问题