Table values parameter (TVP) series 3: use Collection to pass it to SP as a parameter

original
2014/06/11 12:01
Reading number 188

1、 Review

The previous section described "using DataTable objects in ADO.NET to pass them to the storage process as parameters".
The DataTable instance completes two parts:
1) Data of DataTable is transferred to Stored Procedure
2) Using the TVP data of DataTable, you can participate in the reading and writing of other entity data (DataReader).
The content of this part, through the Collection object, still needs to implement the above two instances.

 

2、 At ADO NET, use the Collection object to pass it as a parameter to the stored procedure

Through examples, we have a deeper perceptual understanding of how to use each characteristic and parameter. At the same time, through
The transformation of these examples can also make their own program code.
This time, the main output is Sample, which contains two parts:
1) Data of DataTable is transferred to Stored Procedure
2) Using the TVP data of DataTable, you can participate in the reading and writing of other entity data (DataReader).
Specific examples are as follows:

 


  
  
  1.     // ---Main Sub  
  2.       private void btnCollection_Click(object sender, EventArgs e) 
  3.         { 
  4.             // ------Use OrderItem object  
  5. List<OrderItem> orderItems = new List<OrderItem>();  
  6.             orderItems. Add (new OrderItem() { OrderId = 901, CustomerId = 67, OrderedAt = DateTime.Now });  
  7.             orderItems. Add (new OrderItem() { OrderId = 902, CustomerId = 68, OrderedAt = DateTime.Now });  
  8. OrderItemCollection itemCollection = new OrderItemCollection();  
  9.             itemCollection. AddRange(orderItems);  
  10.             // ------Use OrderDetail object  
  11. List<OrderDetail> orderDetails = new List<OrderDetail>();  
  12.             orderDetails. Add (new OrderDetail() { OrderId = 901, LineNumber = 1, ProductId = 34, Quantity = 2, Price = 10.5m });  
  13.             orderDetails. Add (new OrderDetail() { OrderId = 901, LineNumber = 2, ProductId = 100, Quantity = 45, Price = 3.8m });  
  14.             orderDetails. Add (new OrderDetail() { OrderId = 901, LineNumber = 3, ProductId = 56, Quantity = 67, Price = 9.1m });  
  15.             orderDetails. Add (new OrderDetail() { OrderId = 902, LineNumber = 1, ProductId = 88, Quantity = 5, Price = 88.5m });  
  16.             orderDetails. Add (new OrderDetail() { OrderId = 902, LineNumber = 2, ProductId = 1, Quantity = 345, Price = 0.465m });  
  17. OrderDetailCollection detailCollection = new OrderDetailCollection();  
  18.             detailCollection. AddRange(orderDetails);  
  19.           // ----  
  20.             using (SqlConnection conn = new SqlConnection( "Data Source=;Initial Catalog=AdventureWorks; User ID=sa; Password=" )) 
  21.             { 
  22.                 conn. Open ();  
  23.                 // ---Passing a Table-Valued Parameter to a Stored Pcocedure  
  24.                 using (SqlCommand cmd = new SqlCommand( "dbo.OrderItem$Insert" , conn)) 
  25.                 { 
  26.                     cmd. CommandType = CommandType. StoredProcedure;  
  27.                     // ---Note: The two parameter names below should be consistent with the SP parameter names.  
  28.                     SqlParameter tvpOrderItem = cmd. Parameters.AddWithValue( "@OrderHeaders" , itemCollection);  
  29.                     SqlParameter tvpOrderDetail = cmd. Parameters.AddWithValue( "@OrderDetails" , detailCollection);  
  30.                     tvpOrderItem. SqlDbType = SqlDbType. Structured;  
  31.                     tvpOrderDetail. SqlDbType = SqlDbType. Structured;  
  32.                     cmd. ExecuteNonQuery();  
  33.                 } 
  34.                 // ---Streadming rows with a dataReader  
  35.                 string sql = @" select  tvp1.OrderId, tvp1.CustomerId, tvp2.LineNumber, tvp2.ProductId 
  36.                              from     dbo. OrderItem  as  tvp1  INNER   JOIN  @tvpDetail  as  tvp2  ON  tvp1.OrderId=tvp2.OrderId 
  37.                              order   by  tvp2.OrderId, tvp2.LineNumber; "; 
  38.                 SqlCommand readCommand = new SqlCommand(sql, conn);  
  39.                 readCommand. CommandType = CommandType. Text;  
  40.                 SqlParameter tvpDetail = readCommand. Parameters.AddWithValue( "@tvpDetail" , detailCollection);  
  41.                 tvpDetail. SqlDbType = SqlDbType. Structured;  
  42.                 tvpDetail. TypeName =  "dbo.OrderDetail$Udt" ;  
  43.                 SqlDataReader reader = readCommand. ExecuteReader();  
  44.                 while (reader. Read ()) 
  45.                 { 
  46.                     Console. WriteLine(string.Format( "OrderId={0}, CustomrId={1}, LineNumber={2}, ProductId={3}"
  47.                                         reader. GetInt32(0), reader. GetInt32(1), reader. GetInt32(2), reader. GetInt32(3)));  
  48.                 } 
  49.                 reader. Close ();  
  50.                 //  Output  results: 
  51.                 // ------------------  
  52.                 //OrderId=901, CustomrId=67, LineNumber=1, ProductId=34 
  53.                 //OrderId=901, CustomrId=67, LineNumber=2, ProductId=100 
  54.                 //OrderId=901, CustomrId=67, LineNumber=3, ProductId=56 
  55.                 //OrderId=902, CustomrId=68, LineNumber=1, ProductId=88 
  56.                 //OrderId=902, CustomrId=68, LineNumber=2, ProductId=1 
  57.                 // ------------------  
  58.                 conn. Close ();  
  59.             } 
  60.         }  
  61.   // ---OrderItem object   
  62.    public  sealed class OrderItem 
  63.     { 
  64.          public   int  OrderId { get;  set ;  } 
  65.          public   int  CustomerId { get;  set ;  } 
  66.          public  DateTime OrderedAt { get;  set ;  } 
  67.     } 
  68.     // ---OrderDetail object  
  69.      public  sealed class OrderDetail 
  70.     { 
  71.          public   int  OrderId { get;  set ;  } 
  72.          public   int  LineNumber { get;  set ;  } 
  73.          public   int  ProductId { get;  set ;  } 
  74.          public   int  Quantity { get;  set ;  } 
  75.          public   decimal  Price { get;  set ;  } 
  76.     }    
  77.   // ---OrderItemCollection  
  78.      public  sealed class OrderItemCollection: List<OrderItem>, IEnumerable<SqlDataRecord> 
  79.     { 
  80.         #region IEnumerable<SqlDataRecord> Members 
  81.          public  new IEnumerator<SqlDataRecord> GetEnumerator() 
  82.         { 
  83.             SqlDataRecord record = new SqlDataRecord( 
  84.                                     new SqlMetaData( "OrderId" , SqlDbType. Int ), 
  85.                                     new SqlMetaData( "CustomerId" , SqlDbType. Int ), 
  86.                                     new SqlMetaData( "OrderedAt" , SqlDbType. DateTime));  
  87.             foreach(OrderItem item  in  this. ToArray()) 
  88.             { 
  89.                 record. SetInt32(0, item. OrderId);  
  90.                 record. SetInt32(1, item. CustomerId);  
  91.                 record. SetDateTime(2, item. OrderedAt);  
  92.                 yield  return  record;  
  93.             }                      
  94.         } 
  95.         #endregion 
  96.     } 
  97.     // ---OrderDetailCollection  
  98.      public  sealed class OrderDetailCollection: List<OrderDetail>, IEnumerable<SqlDataRecord> 
  99.     { 
  100.         #region IEnumerable<SqlDataRecord> Members 
  101.          public  new IEnumerator<SqlDataRecord> GetEnumerator() 
  102.         { 
  103.             SqlDataRecord record = new SqlDataRecord( 
  104.                                     new SqlMetaData( "OrderId" , SqlDbType. Int ), 
  105.                                     new SqlMetaData( "LineNumber" , SqlDbType. Int ), 
  106.                                     new SqlMetaData( "ProductId" , SqlDbType. Int ), 
  107.                                     new SqlMetaData( "Quantity" , SqlDbType. Int ), 
  108.                                     new SqlMetaData( "Price" , SqlDbType. Money));  
  109.             foreach (OrderDetail detail  in  this. ToArray()) 
  110.             { 
  111.                 record. SetInt32(0, detail. OrderId);  
  112.                 record. SetInt32(1, detail. LineNumber);  
  113.                 record. SetInt32(2, detail. ProductId);  
  114.                 record. SetInt32(3, detail. Quantity);  
  115.                 record. SetDecimal(4, detail. Price);  
  116.                 yield  return  record;  
  117.             } 
  118.         } 
  119.         #endregion 
  120.     } 

 

3、 Others

Through the content description and examples of the three parts of Table Values, I believe you have a certain understanding of the application of TVP.
In programming, some people may still be used to using awkward commas to separate lists or XML when inserting multiple items or selecting multiple rows of data,
Although it is competent, it does not exist in the customary object mode, and its access speed is also very slow.
Therefore, I suggest that when you use IN statements and other programs that need to send multiple lines of data, you should consider using TVP, which will achieve satisfactory results.
On this aspect, we still need constant communication and discussion.

 

4、 Reference Documents

See URL:
ms- help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/5e95a382-1e01-4c74-81f5-055612c2ad99.htm
ms- help://MS.MSDNQTR.v90.en/wd_adonet/html/370c16d5-db7b-43e3-945b-ccaab35b739b.htm

Expand to read the full text
Loading
Click to lead the topic 📣 Post and join the discussion 🔥
Reward
zero comment
zero Collection
zero fabulous
 Back to top
Top