程序笔记   发布时间:2022-06-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Table-values parameter(TVP)系列之三: 利用Collection将其作为参数传给SP大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一,回顾

 

上一部分讲述了“在ADO.NET中利用Datatable对象,将其作为参数传给存贮过程”。
通过Datatable实例,完成了两部分的内容:
  1)Datatable的数据传输给Stored Procedure
  2)利用Datatable的TVP数据,可以参与别的实体数据读写(DataReader)。
这一部分的内容,通过Collection对象,还是要实现上边的两个实例。

 

二,在ADO.NET中利用Collection对象,将其作为参数传给存贮过程

 

  通过实例,大家对各个特性和参数的如何使用,有更深刻的感性认识。同时,通过
这些实例的改造,也可做出符合自己的程序代码。
  这次,还是主要输出Sample,包含两部分的内容:
  1)Datatable的数据传输给Stored Procedure
  2)利用Datatable的TVP数据,可以参与别的实体数据读写(DataReader)。
  具体实例如下:

    //---Main Sub
      private voID btnCollection_Click(object sender,EventArgs E)
        {
            //------利用OrderItem object
List<OrderItem> orderItems = new List<OrderItem>();
            orderItems.Add(new OrderItem() { OrderID = 901,CustomerID = 67,orderedAt = datetiR_509_11845@e.Now });
            orderItems.Add(new OrderItem() { OrderID = 902,CustomerID = 68,orderedAt = datetiR_509_11845@e.Now });
OrderItemCollection itemCollection = new OrderItemCollection();
            itemCollection.AddRange(orderItems);
            //------利用OrderDetail object
List<OrderDetail> orderDetails = new List<OrderDetail>();
            orderDetails.Add(new OrderDetail() { OrderID = 901,linenumber = 1,ProductID = 34,Quantity = 2,Price = 10.5m });
            orderDetails.Add(new OrderDetail() { OrderID = 901,linenumber = 2,ProductID = 100,Quantity = 45,Price = 3.8m });
            orderDetails.Add(new OrderDetail() { OrderID = 901,linenumber = 3,ProductID = 56,Quantity = 67,Price = 9.1m });
            orderDetails.Add(new OrderDetail() { OrderID = 902,ProductID = 88,Quantity = 5,Price = 88.5m });
            orderDetails.Add(new OrderDetail() { OrderID = 902,ProductID = 1,Quantity = 345,Price = 0.465m });
OrderDetailCollection detailCollection = new OrderDetailCollection();
            detailCollection.AddRange(orderDetails);
          //----
            using (sqlConnection conn = new sqlConnection("Data source=;Initial Catalog=AdventureWorks;User ID=sa;password="))
            {
                conn.open();
                //---Passing a table-Valued Parameter to a Stored Pcocedure
                using (sqlCommand cmd = new sqlCommand("dbo.orderItem$Insert",conn))
                {
                    cmd.Command@R_696_4763@ommandType.StoredProcedure;
                    //---注意:下边的两个参数名,要和SP的参数名一致。
                    sqlParameter tvpOrderItem = cmd.Parameters.AdDWithValue("@Orderheaders",itemCollection);
                    sqlParameter tvpOrderDetail = cmd.Parameters.AdDWithValue("@OrderDetails",detailCollection);
                    tvpOrderItem.sqlDbType = sqlDbType.Structured;
                    tvpOrderDetail.sqlDbType = sqlDbType.Structured;
                    cmd.ExecuteNonquery();
                }
                //---Streadming rows with a dataReader
                String sql = @"SELEct tvp1.orderID,tvp1.CustomerID,tvp2.linenumber,tvp2.ProductID
                            from    dbo.orderItem as tvp1 INNER JOIN @tvpDetail as tvp2 ON tvp1.orderID=tvp2.orderID
                            order by tvp2.orderID,tvp2.linenumber;";
                sqlCommand ReadCoR_509_11845@mand = new sqlCommand(sql,conn);
                ReadCoR_509_11845@mand.Command@R_696_4763@ommandType.Text;
                sqlParameter tvpDetail = ReadCoR_509_11845@mand.Parameters.AdDWithValue("@tvpDetail",detailCollection);
                tvpDetail.sqlDbType = sqlDbType.Structured;
                tvpDetail.Typename = "dbo.orderDetail$Udt";
                sqlDataReader reader = ReadCoR_509_11845@mand.ExecuteReader();
                while (reader.Read())
                {
                    Console.Writeline(String.Format("OrderID={0},CustomrID={1},linenumber={2},ProductID={3}",reader.GeTint32(0),reader.GeTint32(1),reader.GeTint32(2),reader.GeTint32(3)));
                }
                reader.Close();
                // Output results:
                //------------------
                //OrderID=901,CustomrID=67,linenumber=1,ProductID=34
                //OrderID=901,linenumber=2,ProductID=100
                //OrderID=901,linenumber=3,ProductID=56
                //OrderID=902,CustomrID=68,ProductID=88
                //OrderID=902,ProductID=1
                //------------------
                conn.Close();
            }
        } 
  //---OrderItem object 
  public sealed class OrderItem
    {
        public int OrderID { get; set; }
        public int CustomerID { get; set; }
        public datetiR_509_11845@e orderedAt { get; set; }
    }
    //---OrderDetail object
    public sealed class OrderDetail
    {
        public int OrderID { get; set; }
        public int linenumber { get; set; }
        public int ProductID { get; set; }
        public int Quantity { get; set; }
        public decimal Price { get; set; }
    }   
  //---OrderItemCollection
    public sealed class OrderItemCollection: List<OrderItem>,IEnumerable<sqlDataRecord>
    {
        #region IEnumerable<sqlDataRecord> Members
        public new IEnumerator<sqlDataRecord> GetEnumerator()
        {
            sqlDataRecord record = new sqlDataRecord(
                                    new sqlMetaData("OrderID",sqlDbType.int),new sqlMetaData("CustomerID",new sqlMetaData("orderedAt",sqlDbType.datetiR_509_11845@E));
            foreach(OrderItem item in this.ToArray())
            {
                record.SeTint32(0,item.OrderID);
                record.SeTint32(1,item.CustomerID);
                record.SetdatetiR_509_11845@e(2,item.orderedAt);
                yIEld return record;
            }                     
        }
        #endregion
    }
    //---OrderDetailCollection
    public sealed class OrderDetailCollection: List<OrderDetail>,new sqlMetaData("linenumber",new sqlMetaData("ProductID",new sqlMetaData("Quantity",new sqlMetaData("Price",sqlDbType.Money));
            foreach (OrderDetail detail in this.ToArray())
            {
                record.SeTint32(0,detail.orderID);
                record.SeTint32(1,detail.linenumber);
                record.SeTint32(2,detail.ProductID);
                record.SeTint32(3,detail.Quantity);
                record.Setdecimal(4,detail.PricE);
                yIEld return record;
            }
        }
        #endregion
    }

 

三,其他

 

  通过table-Values三部分的内容描述和实例,相信大家对TVP的应用有了一定的了解。
在编程中也许有人还是习惯在插入多项或SELEct多行数据时,使用笨拙的逗号分隔列表或XML,
其能够胜任,但不是以习惯的对象方式存在,而且存取速度也很慢。
所以,我建议大家在使用IN语句等需要发送多行数据的编程时,多虑使用TVP的方式,会取满意的效果。
关于这方面的内容,还需要大家不断的交流和探讨。

 

四,参文档

 

参看URL: @H_151_5@ms-Help://Ms.sqlCC.v10/Ms.sqlSVR.v10.en/s10de_1devconc/HTML/5e95a382-1e01-4c74-81f5-055612c2ad99.htm @H_151_5@ms-Help://Ms.MSDNQTR.v90.en/wd_adonet/HTML/370c16d5-db7b-43e3-945b-ccaab35b739b.htm

大佬总结

以上是大佬教程为你收集整理的Table-values parameter(TVP)系列之三: 利用Collection将其作为参数传给SP全部内容,希望文章能够帮你解决Table-values parameter(TVP)系列之三: 利用Collection将其作为参数传给SP所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。