打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SqlParameter对象加到两个Command中报错的内部探秘—asp.net培训|W...
userphoto

2012.02.07

关注


作者:传智播客.Net培训学院讲师 赵晓虎

 
将同一个SqlParameter加到两个不同的SqlCommand对象的Parameters集合中时,会报如下错误:
 
另一个 SqlParameterCollection 中已包含 SqlParameter。
 
即便第一个SqlCommand对象已经释放了资源Dispose()以后,也不能再将同一个SqlParameter对象再加到另外一个SqlCommand对象中。
 
但是如果第一个SqlCommand对象使用完毕以后调用一下Clear()方法,则该SqlParameter对象可以让其他SqlCommand重复使用.
 
通过查看SqlParameterCollection类的Clear();方法得知:在该方法中调用了SqlParameter的ResetParent()方法,这个方法中有一句代码:
this._parent = null;,该代码表示将当前SqlParameter对象所在的集合设置为null。猜测:可能是只要将当前SqlParameter对象的_parent字段设置为null,则该对象可重复使用。经如下代码验证,确实是这样:
 
class Program
    {
        static void Main(string[] args)
        {
            SqlParameter p1 = new SqlParameter("@p", 10);
            F1(p1);
 
            F2(p1);
 
            Console.WriteLine("ok");
            Console.ReadKey();
        }
 
        static void F1(SqlParameter p1)
        {
            //SqlConnection con = new SqlConnection();
 
            SqlCommand cmd = new SqlCommand();
 
 
 
            cmd.Parameters.Add(p1);
 
            //Type t = typeof(SqlParameter);
            //FieldInfo info = t.GetField("_parent", BindingFlags.Instance | BindingFlags.NonPublic);
            //object obj = info.GetValue(p1);
            //Console.WriteLine(obj);
 
            cmd.Dispose();
        }
 
        static void F2(SqlParameter p1)
        {
            //SqlConnection con = new SqlConnection();
 
            SqlCommand cmd = new SqlCommand();
 
            //object obj1 = cmd.Parameters;
 
            #region MyRegion
 
            Type t = typeof(SqlParameter);
            FieldInfo info = t.GetField("_parent", BindingFlags.Instance | BindingFlags.NonPublic);
            //object obj = info.GetValue(p1);
            //如果没有下面这句代码,则再次执行 cmd.Parameters.Add(p1);会报错!
            //也就是说将p1._parent设置为null,则可以将一个SqlParameter参数添加到多个SqlCommand中。
            info.SetValue(p1, null);
            //Console.WriteLine(obj);
 
            #endregion
 
            //有了上面那句代码这里就不报错了。
            cmd.Parameters.Add(p1);
 
 
            cmd.Dispose();
        }
    }
 
也就是说当一个SqlParameter对象被某个SqlCommand对象添加到Parameters集合中的时候,SqlParameter对象自己会记录一下,被加到那个Parameters集合中了。如果下次再被其他SqlCommand对下加到Parameters集合时会检查_parent字段是否为null,如果不为null则抛出异常(System.ArgumentException ):
另一个 SqlParameterCollection 中已包含 SqlParameter。
 

联系电话:010-51552111 010-51552112 传真:010-51552110 E-mail:yzk@itcast.cn
地址:北京市海淀区国家信息产业基地上地东路27号春生泰克大厦406室 邮编:100085
版权所有:北京传智播客教育科技有限公司--专业java培训与.net培训机构 ? 2006-2012 京ICP备08001421号
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
操作数据库类SQLHelp.cs
步步为营 .NET三层架构解析 三、SQLHelper设计-程序开发-红黑联盟
.net使用中sqlcommand的用法
C#中往数据库插入/更新时候关于NUll空值的处理
SQLCommand命令、DbTransaction事务
[.NET]ADO.NET调用存储过程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服