C#与数据库访问技术总结(八)之ExecuteNonQuery方法
ExecuteNonQuery方法
ExecuteNonQuery方法主要用来更新数据。
通常使用它来执行Update、Insert和Delete语句。
该方法返回值意义如下:
对于Update、Insert和Delete语句,返回值为该命令所影响的行数。
对于所有其他类型的语句,返回值为-1。
Command对象通过ExecuteNonQuery方法更新数据库的过程非常简单,需要进行的步骤如下:
(1)创建数据库连接。
(2)创建Command对象,并指定一个SQL Insert、Update、Delete查询或存储过程。
(3)把Command对象依附到数据库连接上。
(4)调用ExecuteNonQuery方法。
(5)关闭连接。
下面依次看一看更新、添加和删除操作。
更新记录
下面的代码显示了一个简单的数据库更新操作,其作用是修改学号为“20013150“的学生信息:
string updateQuery="Update studentInfo set sName='小李'"+"Where ID='200131500145'"; //新建连接 SqlConnection conn=new SqlConnection(); conn.Connectionstring=connectionString; //新建命令对象 SqlCommand cmd=new SqlCommand(updateQuery,conn); // 调用命令对象的ExecuteNonQuery方法 conn.Open(); int RecordsAffected=cmd. ExecuteNonQuery(); conn.Close();
代码本身非常简单。
但需要注意的是ExecuteNonQuery方法的返回值,这个方法返回命令影响的记录数量。
例如,如果命令是SQL UPDATE语句,则将返回被更新记录的数量。
相似的,当执行INSERT命令时返回插入到数据库的记录的数量。
如果期望命令更新记录,但是ExecuteNonQuery方法返回的值为0,则说明更新操作失败了。
(1)字符串拼接方式
也许读者已经注意到了在上面的代码中updateQuery是在程序中定义的,其操作固定在了程序中,用户无法和应用程序交互,
而在实际中命令应该根据用户输入的信息进行处理,比如用户在文本框中输入了新的用户信息以后单击更新,
然后程序将用户输入的数据更新到数据库。
要达到这个目的,就必须依据用户输入的数据来构造命令。构造命令可以有多种形式。
假设现在已经将用户输入的数据保存到了变量中:
String userName="小李";
String userId="200131500145";
此时userName和user id变量分别保存了学生姓名和学号,命名可以通过如下拼接命令字符串的形式构造:
string updateQuery="Update student Set sName=' "+username+" ' "+"Where ID=' "+user id+" ' "
这种拼接字符串构造命令的方式是最直接最简单的,但也是最不安全的。
可以采用参数化来实现相同的功能。
(2)参数化方式
SQL Server.NET数据提供程序和OLE DB.NET数据提供程序在指定参数时区别非常大,下面分别介绍。
①在SQL Server .NET数据提供程序中指定参数
SQL Server .NET数据提供程序支持指定的参数。
当命令文本在指定具体命令时,必须指出哪一部分是在运行时进行设置的,也就是必须指出哪部分是参数。
那些可变的部分即参数,它们都必须有一个@前缀。
Update student set sName=@userName where ID=@userid
这个命令中,@userName和@userid为参数,它们的值在运行时是可变的。
当命令中带参数时,构造Command对象的方法和前面的并没有任何不同:
string updateQuery="Update student Set sName=@username"+"Where ID=@userid" ;
SqlConnection conn=new SqlConnection(connectionString);
SqlCommand cmd=new SqlCommand(updateQuery, conn);
现在就有了包含参数的Command对象。
目前需要做的就是为命令中的每一个参数创建一个Parameter对象。
SqlCommand类提供了一个Parameters集合属性,用以为命令保存所有的参数。
通过调用Parameters集合的Add方法,在集合中添加一个新的参数。
crud. Parameters.Add (" @userName", userName);
cmd. Parameters.Add("@userid", userid);
上面Add方法中的第一个参数为命令中的参数名,后面的userName则是用于定义的变量,保存了用户输入的信息。
除此之外,可以用其他方法创建Parameter对象,然后添加到集合中。
SqlParameter paramUserName= new SqlParameter("@userName",SqlDbType.NVarChar,50);
paramUserName.Value=userName;
cmd. Parameters.Add(paramUserName) ;
上面的代码
首先新建了一个SqlParameter对象,命名为paramUserName,该对象对应于命令中的@userName参数,在SqlParameter的构造函数中为参数指定了类型为SqlDbType.NVarChar,长度为50。
接着为paramUserName指定了Value属性,表示在运行时将用这个值代替命令中的@userName。
最后是调用Add方法将参数添加到命令的参数集合中,这一步很容易被初学者忽略,要格外注意。
带参数的命令设置好以后可以和往常一样执行ExecuteNonQuery方法,这并没有任何不同。
除了直接使用SQL语句作为命令以外,还可以使用存储过程作为命令内容。
为了ADO.NET应用程序中执行存储过程,需要把存储过程的名称赋给命令文本,同时将命令的CommandType属性设置为存储过程。
如果存储过程返回值,或者有一些参数,还必须创建参数,并把创建的参数添加到命令的Parameters集合中。
在数据库Student添加如下名为UpdateStudentInfo的存储过程,
代码如下:
CREATE PROCEDURE UpdateStudentInfo ( @userName nvarchar(20), @user id nvarchar(20); ) AS Update studentInfo Set sName=@userName Where ID=@user id GO
为了执行该存储过程,必须创建一个Command对象并将存储过程的名称传入它的构造函数。
SqlConnection
conn=new SqlConnection(connectionString);
SqlCommand
cmd=new SqlCommand("UpdateStudentInfo", conn);
接下来要把命令的CommandType属性设置为StoredProcedure。
cmd.CommandType=CommandType.StoredProcedure;
后续步骤和参数化命令是相同的,先设置参数然后执行对应命令。
C#与数据库访问技术总结(八)之ExecuteNonQuery方法的更多相关文章
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...
- 数据库访问技术 odbc dao rdo uda jet oledb
一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
- C#与数据库访问技术总结(七)综合示例
综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...
- C#与数据库访问技术总结(五)之Command对象的常用方法
Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...
- C#与数据库访问技术总结(十二)数据阅读器(DataReader)2
遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当 ...
- VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...
随机推荐
- VC++ 将IP字符串转为 DWORD值
CString strIP="192.168.1.184"; DWORD dwAddress= ntohl( inet_addr(strIP)); m_IPAddr.SetAddr ...
- screen 命令
# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>] 参 ...
- error in opening zip file 1 错误
项目部署服务启动时会出现: error in opening zip file 1 错误 原来是不同服务器编译过的jar包直接下载后发布有问题,重新上传本地编译好的lib下面的jar包后,启动服务,正 ...
- TCP通讯socket自定义协议的实现
转发(JAVA):http://blog.csdn.net/u010818425/article/details/53448817 一个简单的自定义通信协议(socket),http://blog.c ...
- SDN 收集一下最近的资料
SDN导论 SDN原理(Openflow)视频 SDN lab SDN Openflow(北航入门简介) 书籍 <深度解析SDN-利益.战略.技术.实践> -张卫峰
- 将Qt5.5 动态链接生成的exe及依赖dll打包方法
Qt静态编译链接生成的exe文件,不需依赖七大姑八大姨的一堆dll,可以独立运行,发布很方便.但绝大多数用的都是Qt开源版本,如果用静态链接,会有些限制.那有没有办法即能享受静态编译的方便,又不受开源 ...
- __slots__ 属性绑定
s = Student() # 创建新的实例 s.name = 'Michael' # 绑定属性'name' s.age = 25 # 绑定属性'age' s.score = 99 # 绑定属性'sc ...
- oracle学习
在平时的工作学习中,经常需要使用到oracle数据库,将平时用到的一些技巧记录在这里,以便以后随时可以翻阅. 1.日期类型的比较 插入日期时,经常会使用sysdate来插入数据,但sysdate插入的 ...
- Linux下的网络远程安装
Linux下的网络远程安装 1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 #mount #umount /dev/cdrom #mkdir /mnt/ ...
- Android性能优化方法(七)
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...