轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-16 13:21:40.000|閱讀 430 次
概述:上一部分講述了“在ADO.NET中利用DataTable對象,將其作為參數(shù)傳給存貯過程”。 本文將介紹如何利用Collection將其作為參數(shù)傳給SP ,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
一、回顧
上一部分講述了“在ADO.NET中利用DataTable對象,將其作為參數(shù)傳給存貯過程”。
通過DataTable實(shí)例,完成了兩部分的內(nèi)容:
1)DataTable的數(shù)據(jù)傳輸給Stored Procedure
2)利用DataTable的TVP數(shù)據(jù),可以參與別的實(shí)體數(shù)據(jù)讀寫(DataReader)。
這一部分的內(nèi)容,通過Collection對象,還是要實(shí)現(xiàn)上邊的兩個實(shí)例。
二、在ADO.NET中利用Collection對象,將其作為參數(shù)傳給存貯過程
通過實(shí)例,大家對各個特性和參數(shù)的如何使用,有更深刻的感性認(rèn)識。同時,通過 這些實(shí)例的改造,也可做出符合自己的程序代碼。
這次,還是主要輸出Sample,包含兩部分的內(nèi)容:
1)DataTable的數(shù)據(jù)傳輸給Stored Procedure
2)利用DataTable的TVP數(shù)據(jù),可以參與別的實(shí)體數(shù)據(jù)讀寫(DataReader)。
具體實(shí)例如下:
//---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 = DateTime.Now });
orderItems.Add(new OrderItem()
{ OrderId = 902, CustomerId = 68, OrderedAt = DateTime.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,
LineNumber = 1, ProductId = 88, Quantity = 5, Price = 88.5m });
orderDetails.Add(new OrderDetail() { OrderId = 902,
LineNumber = 2, 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.CommandType = CommandType.StoredProcedure;
//---注意:下邊的兩個參數(shù)名,要和SP的參數(shù)名一致。
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 readCommand = new SqlCommand(sql, conn);
readCommand.CommandType = CommandType.Text;
SqlParameter tvpDetail =
readCommand.Parameters.AddWithValue("@tvpDetail", detailCollection);
tvpDetail.SqlDbType = SqlDbType.Structured;
tvpDetail.TypeName = "dbo.OrderDetail$Udt";
SqlDataReader reader = readCommand.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, CustomrId=67, LineNumber=2, ProductId=100
//OrderId=901, CustomrId=67, LineNumber=3, ProductId=56
//OrderId=902, CustomrId=68, LineNumber=1, ProductId=88
//OrderId=902, CustomrId=68, LineNumber=2, ProductId=1
//------------------
conn.Close();
}
}
//---OrderItem object
public sealed class OrderItem
{
public int OrderId { get; set; }
public int CustomerId { get; set; }
public DateTime 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", SqlDbType.Int),
new SqlMetaData("OrderedAt", SqlDbType.DateTime));
foreach(OrderItem item in this.ToArray())
{
record.SetInt32(0, item.OrderId);
record.SetInt32(1, item.CustomerId);
record.SetDateTime(2, item.OrderedAt);
yield return record;
}
}
#endregion
}
//---OrderDetailCollection
public sealed class OrderDetailCollection:
List<OrderDetail>, IEnumerable<SqlDataRecord>
{
#region IEnumerable<SqlDataRecord> Members
public new IEnumerator<SqlDataRecord> GetEnumerator()
{
SqlDataRecord record = new SqlDataRecord(
new SqlMetaData("OrderId", SqlDbType.Int),
new SqlMetaData("LineNumber", SqlDbType.Int),
new SqlMetaData("ProductId", SqlDbType.Int),
new SqlMetaData("Quantity", SqlDbType.Int),
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三部分的內(nèi)容描述和實(shí)例,相信大家對TVP的應(yīng)用有了一定的了解。 在編程中也許有人還是習(xí)慣在插入多項(xiàng)或Select多行數(shù)據(jù)時,使用笨拙的逗號分隔列表或XML, 雖其能夠勝任,但不是以習(xí)慣的對象方式存在,而且存取速度也很慢。 所以,我建議大家在使用IN語句等需要發(fā)送多行數(shù)據(jù)的編程時,多考慮使用TVP的方式,會取滿意的效果。 關(guān)于這方面的內(nèi)容,還需要大家不斷的交流和探討。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載