大佬教程收集整理的这篇文章主要介绍了Table-values parameter(TVP)系列之三: 利用Collection将其作为参数传给SP,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
上一部分讲述了“在ADO.NET中利用Datatable对象,将其作为参数传给存贮过程”。
通过Datatable实例,完成了两部分的内容:
1)Datatable的数据传输给Stored Procedure
2)利用Datatable的TVP数据,可以参与别的实体数据读写(DataReader)。
这一部分的内容,通过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,请注明来意。