本帖最后由 ¤好孩子¤ 于 2014-1-16 22:29 编辑
最近在写一个数据同步的程序,因为数据量比较大,所以用了表值参数,部分代码如下
[C#] 纯文本查看 复制代码 //获得表值参数的值
SetTable(dt,out t, out t0, out ta, out th, out to, out tu);
SqlCommand cm = new SqlCommand("p_sync", SqlDB.oDB.GetConnection());
try
{
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@tablename", SqlDbType.VarChar, 50).Value = curSyncTable;
SqlParameter p = new SqlParameter("@dht_type_table", SqlDbType.Structured);
p.TypeName = "dht_type";
p.Value = t;
cm.Parameters.Add(p);
p = new SqlParameter("@dht_detail_a_table", SqlDbType.Structured);
p.TypeName = "dht_detail";
p.Value = ta;
cm.Parameters.Add(p);
p = new SqlParameter("@dht_detail_h_table", SqlDbType.Structured);
p.TypeName = "dht_detail";
p.Value = th;
cm.Parameters.Add(p);
p = new SqlParameter("@dht_detail_o_table", SqlDbType.Structured);
p.TypeName = "dht_detail";
p.Value = to;
cm.Parameters.Add(p);
p = new SqlParameter("@dht_detail_u_table", SqlDbType.Structured);
p.TypeName = "dht_detail";
p.Value = tu;
cm.Parameters.Add(p);
p = new SqlParameter("@dht_detail_0_table", SqlDbType.Structured);
p.TypeName = "dht_detail";
p.Value =t0;
cm.Parameters.Add(p);
cm.ExecuteNonQuery();
}
finally
{
cm.Connection.Close();
}
其中t、t0、ta、th、to、tu是 List<SqlDataRecord>类型的
程序运行时,由于数据原因,t0、ta、th、to、tu中并不总是有记录的,按我上面的写法,程序会捕获到如下错误
它的意思很显示,这个List<SqlDataRecord>得有记录才行,我也尝试着写
[C#] 纯文本查看 复制代码 if (ta.Count <= 0) p.Value = DBNull.Value;
这样的代码,但它会说不允许为DBNull。
此时,又想从数据库入手,数据库代码如下
[SQL] 纯文本查看 复制代码 ALTER PROCEDURE [dbo].[p_sync]
@tablename varchar(50)='',
@dht_type_table dht_type readonly,
@dht_detail_a_table dht_detail readonly,
@dht_detail_h_table dht_detail readonly,
@dht_detail_o_table dht_detail readonly,
@dht_detail_u_table dht_detail readonly,
@dht_detail_0_table dht_detail readonly
AS
begin tran
begin try
--根据传入的表名插入表
declare @sql nvarchar(max)
set @sql='insert into ' +@tablename +' select * from @dht_type_tab'
exec sp_executesql @sql,'@dht_type_tab dht_type readonly',@dht_type_table
--这里动态sql里不能使用pvt作为参数,为了说明问题,这里暂且这么写
--表值参数传递更新
insert into dht_detail_00
select * from @dht_detail_0_table
insert into dht_detail_a0
select * from @dht_detail_a_table
insert into dht_detail_h0
select * from @dht_detail_h_table
insert into dht_detail_o0
select * from @dht_detail_o_table
insert into dht_detail_u0
select * from @dht_detail_u_table
end try
begin catch
--未知异常,回滚事务
rollback tran
exec p_errorlog ''
return -9999
end catch
这里也不能给这些表值参数赋null值,我就郁闷了,愣在这里,求大佬帮助
|