苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 12390|回复: 3

[其他] 存储过程表值参数怎样传递一个空或Null

[复制链接]
发表于 2014-1-16 20:50:27 | 显示全部楼层 |阅读模式
本帖最后由 ¤好孩子¤ 于 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中并不总是有记录的,按我上面的写法,程序会捕获到如下错误


错误.jpg

它的意思很显示,这个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值,我就郁闷了,愣在这里,求大佬帮助








1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-1-17 08:47:49 | 显示全部楼层
DBNull.Value
 楼主| 发表于 2014-1-17 20:07:28 | 显示全部楼层

今天没能联网,sorry sorry

不能用DBNull.Value的,它会提示另一个错误信息的哦,


问题我今天解决了,不能用IList<SqlDataRecord>这种用法,因为它是结构不定的,在添加的时候进行new,


而pvt在传入存储过程的时候必须得结构明确


所以我选择了DataTable进行传参




其实传入存储过程的表值参数有三种方式,IList、DataTable、从 DbDataReader 中派生的任何对象。具体代码我也不知道怎么贴~~

飞哥啥时候也出个数据库的系列,把这些实用但不常用的方式写出来,哇咔咔




发表于 2014-1-17 20:14:00 | 显示全部楼层
解决了就好,这个系列再说吧,哈哈
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-2-28 18:23

© 2014-2021

快速回复 返回顶部 返回列表