`
wsql
  • 浏览: 11794981 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ADO.NET的记忆碎片(九)

 
阅读更多

这一篇是讲复杂更新数据,在讲复杂更新之前,我们要先将参数化查询,今天我猛然发现,参数化查询我真的之前没有提到过,
不过在上篇中有用到参数化查询,那我今天就正好把参数化的查询这一块内容整理出来,不要留下什么盲点。
参数化查询
假设一种场景,希望获得一位特定的用户订单信息,希望执行下面的SQL查询:


**select OrderID,CustomerID,OrderDate,EmployeeIDfrom Orders where CustomerID = @CustomerID


要在ADO.NET对象模型中执行一个参数化查询,需要向Command对象的Parameters集合中添加Parameter对象。
参考代码如下:

SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection("连接字符串");
cmd.CommandText = "select OrderID,CustomerID,OrderDate,EmployeeID from Orders where CustomerID = @CustomerID";
SqlParameter p;
p = new SqlParameter();
p.ParameterName = "@CustomerID";
p.Value = "ALFKI";
cmd.Parameters.Add(p);

**使用语法糖

p = cmd.Parameters.AddWithValue("@CustomerID", "ALFKI");


*显式设置数据类型
*有两种方法可以对参数的类型进行设置:设置SqlParameter对象的SqlDbType属性,或者在SqlParameter的构造函数中设置
*参考代码如下:
构造函数中设置

p = new SqlParameter("@CustomerID",SqlDbType.NVarChar,5);
p.Value = "ALFKI";
cmd.Parameters.Add(p);

设置SqlParameter对象的SqlDbType属性

p.SqlDbType = SqlDbType.NVarChar;
p.Size = 5;

*参数的方向
*在上面的类子中我们设置的参数都是输入参数,还可以使用参数从数据库中获取数据。即是:使用输出参数,返回结果,而且性能会更好
*假设使用输入参数根据ProductName来查询数据,并通过输出参数来返回Price和InStock的值,SQL语句如下:
*select @Price = Price,@InStock = InStock from Products where ProductName = @ProductName
*参考代码如下:

SqlCommand cmd2 = new SqlCommand();
cmd2.Connection = new SqlConnection("连接字符串");
cmd2.CommandText = "select @Price = Price,@InStock = InStock from Products where ProductName = @ProductName";
SqlParameter price,instock,productname;
price = cmd.Parameters.Add("@Price",SqlDbType.Money);
price.Direction = ParameterDirection.Output;
instock = cmd.Parameters.Add("@InStock", SqlDbType.NVarChar,20);
instock.Direction = ParameterDirection.Output;
productname = cmd.Parameters.Add("@ProductName", SqlDbType.NVarChar, 40);
productname.Value = "Chai";
cmd2.ExecuteNonQuery();
if (price.Value == DBNull.Value)
{
Console.WriteLine("No found named {0}", productname.Value);
}
else
{
Console.WriteLine("{0}--{1}", price.Value, instock.Value);
}

复杂更新:提交更新后刷新一行
在提交更新后刷新一行,因为有时间截列,可以保证数据不会被乱改,所以在提交更新后刷新一行是非常有必要的,
我们的解决方法就是用输出参数获取新行数据,使用SQL语句是:

update OrderDetailsWithTimestamp
set OrderID = @OrderIDNew, ProductID = @ProductIDNew, Quantity = @QuantityNew, Price = @PriceNew
where OrderID = @OrderIDOld and ProductID = @ProductIDOld and Timestamp = @TimestampOld
if @@ROWCOUNT <> 0 then
select @QuantityNew = Quantity,@PriceNew = Price, @TimestampNew = Timestamp
from OrderDetailsWithTimestamp
where OrderID = @OrderIDNew and ProductID=@ProductIDNew

参考代码如下:

cmd2.CommandText = "update OrderDetailsWithTimestamp" +
"set OrderID = @OrderIDNew, ProductID = @ProductIDNew, Quantity = @QuantityNew, Price = @PriceNew" +
"where OrderID = @OrderIDOld and ProductID = @ProductIDOld and Timestamp = @TimestampOld" +
"if @@ROWCOUNT <> 0 then" +
"select @QuantityNew = Quantity,@PriceNew = Price, @TimestampNew = Timestamp" +
"from OrderDetailsWithTimestamp" +
"where OrderID = @OrderIDNew and ProductID=@ProductIDNew";
SqlParameter QuantityNew, PriceNew, TimestampNew;

cmd2.Parameters.AddWithValue("@OrderIDNew", "OrderIDNew");
cmd2.Parameters.AddWithValue("@ProductIDNew", "ProductIDNew");
QuantityNew = cmd2.Parameters.AddWithValue("@QuantityNew", "QuantityNew");
QuantityNew.Direction = ParameterDirection.InputOutput;
PriceNew = cmd2.Parameters.AddWithValue("@PriceNew", "PriceNew");
PriceNew.Direction = ParameterDirection.InputOutput;
TimestampNew = cmd2.Parameters.AddWithValue("@TimestampNew", "TimestampNew");
TimestampNew.Direction = ParameterDirection.Output;
cmd2.Parameters.AddWithValue("@OrderIDOld", "OrderIDOld");
cmd2.Parameters.AddWithValue("@ProductIDOld", "ProductIDOld");
cmd2.Parameters.AddWithValue("@TimestampOld", "TimestampOld");

QuantityNew, PriceNew, TimestampNew这三个输出参数可以作为刷新数据来使用
复杂更新:一次插入多条数据,使用SqlBulkCopy对象
参考代码:

<summary>
向表插入数据
<summary>
<param name="table">在内存中的数据,即将要插入数据库的数据<param>
<param name="database">对应数据库的名称<param>
<param name="database">对应数据库的表名称<param>

public static void InsertTableData(DataTabletable, string database,stringtableName)
{
using (SqlBulkCopybcp = new SqlBulkCopy("Server=.;database=;user id=;Password=;connection reset=false;"))
{
bcp.BatchSize = 100;//每次传输的行数
bcp.DestinationTableName = tableName;//目标表
bcp.WriteToServer(table);
}
}

分享到:
评论

相关推荐

    ADO.NET 4从入门到精通

    《ADO.NET 4从入门到精通》主要内容简介:ADO.NET是windows开发平台上的核心数据技术之一。《ADO.NET 4从入门到精通》是microsoft ADO.NET 4的入门教程,旨在帮助visual basic和c#开发人员了解ADO.NET及相关技术的...

    ADO.Net助手V1.00---一个获取ADO.Net连接字符串,测试SQL命令的辅助软件

    ADO.Net助手是一个获取ADO.Net连接字符串(支持Access,SQLite,SQLServer,MySQL和ORACLE),测试SQL命令,存储过程和数据库之间互导数据的辅助软件。ADO.Net助手还可以用来以插入SQL语句形式导出导入记录,目前提供了...

    ADO.NET考试上机题

    ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试...

    ADO.NET sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较

    数据ADO.NET sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较,主要比较了插入与读取的时间,读取里可以进行模糊检索

    基于ADO.NET的用户登陆与注册系统

    摘要:基于ASP.NET的WEB应用程序项目,使用程序语言C#,利用ADO.NET访问数据库,实现一个简易的用户登陆注册系统。主要实现的功能有用户登陆、用户注册、找回密码,... 关键字:ASP.NET;ADO.NET;WEB;vs2010;数据库

    Professional ADO .NET Programming

    Professional ADO .NET Programming Professional ADO .NET Programming Professional ADO .NET Programming Professional ADO .NET Programming

    ADO.NET自己封装SqlHelper类

    ADO.NET自己封装SqlHelper类 1、简单封装 2、传递参数封装 3、参数可变封装

    ADO.NET数据库访问技术详细资料

    C#与数据库访问技术 ADO.NET(ActiveX Data Object.NET)是Microsoft公司开发的用于数据库连接的... ADO.NET还提供了对XML格式文档的支持,所以通过ADO.NET组件可以方便地在异构环境的项目间读取和交换数据。 ......

    ado.net操作oracle简单参数化sql操作

    关于ado.net简单的参数化查询,操作的是oracle数据库!关于ado.net简单的参数化查询,操作的是oracle数据库!

    ADO.NET 高级编程

    ADO.NET 高级编程,深入剖析ADO.NET类

    学生管理系统+ADO.NET+SQL2005

    学生管理系统源码,ADO.NET进行增删改查学生基本和系别信息,适合毕业设计。

    Microsoft ADO.NET Step by Step

    Table of Contents Microsoft ADO.NET Step by Step Introduction Part I - Getting Started with ADO.NET Chapter 1 - Getting Started with ADO.NET ...

    ADO.NET本质论

    讲解了数据结构,演示了如何用ADO.NET来解决具体的数据访问问题。重点讨论了ADO.NET如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问API(包括OLE DB,ADO...

    ADO.Net数据库访问(代码示例)

    ADO.Net数据库访问(代码示例),介绍了ADO.Net数据库访问的核心技术

    ADO.NET 4从入门到精通源代码

    ADO.NET 4从入门到精通源代码 里面有 未完成的和已完成的 源代码示例

    ADO.NET高级编程

    ADO.NET是Microsoft最新推出的数据访问技术。作为.NET框架的一部分,ADO.NET绝不仅仅是前一版本ADO的简单升级。ADO.NET提供了一组.NET类,这些类不仅可以帮助我们对各种数据源进行高效访问,使我们能够对数据...

    Codesmith ADO.NET 模版

    Codesmith ADO.NET 模版Codesmith ADO.NET 模版Codesmith ADO.NET 模版Codesmith ADO.NET 模版Codesmith ADO.NET 模版Codesmith ADO.NET 模版

    Pro ADO.NET Data Services: Working with RESTful Data

    Pro ADO.NET Data Services: Working with RESTful Data Paperback: 336 pages Publisher: Apress; 1 edition (December 2, 2008) Language: English ISBN-10: 143021614X ISBN-13: 978-1430216148 Format: PDF You...

    ADO.net操作数据库总结

    ADO.net操作数据库总结,包括SqlConnection、SqlCommand等

    ADO.NET技术内幕 part4

    本书是使用Microsoft Visual Studio .NET和ADO.NET编写高可伸缩性、可用Web数据库应用程序的开发人员必备指南。介绍了如何使用ADO.NET在企业级的Web应用程序中访问、排序和处理数据。通过书中丰富的实例和工具,读者...

Global site tag (gtag.js) - Google Analytics