提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-11-16 13:21:40.000|阅读 430 次
概述:上一部分讲述了“在ADO.NET中利用DataTable对象,将其作为参数传给存贮过程”。 本文将介绍如何利用Collection将其作为参数传给SP ,希望对大家有帮助。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
一、回顾
上一部分讲述了“在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 = 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;
//---注意:下边的两个参数名,要和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 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三部分的内容描述和实例,相信大家对TVP的应用有了一定的了解。 在编程中也许有人还是习惯在插入多项或Select多行数据时,使用笨拙的逗号分隔列表或XML, 虽其能够胜任,但不是以习惯的对象方式存在,而且存取速度也很慢。 所以,我建议大家在使用IN语句等需要发送多行数据的编程时,多考虑使用TVP的方式,会取满意的效果。 关于这方面的内容,还需要大家不断的交流和探讨。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢