ExecuteNonQuery方法主要用来更新数据。

通常使用它来执行Update、Insert和Delete语句。

该方法返回值意义如下:

  对于Update、Insert和Delete语句,返回值为该命令所影响的行数。

  对于所有其他类型的语句,返回值为-1。

Command对象通过ExecuteNonQuery方法更新数据库的过程非常简单,需要进行的步骤如下:

(1)创建数据库连接。

(2)创建Command对象,并指定一个SQL Insert、Update、Delete查询或存储过程。

(3)把Command对象依附到数据库连接上。

(4)调用ExecuteNonQuery方法。

(5)关闭连接。

下面依次看一看更新、添加和删除操作。

更新记录

下面的代码显示了一个简单的数据库更新操作,其作用是修改学号为“20013150“的学生信息:

 1 string updateQuery="Update studentInfo set sName=‘小李‘"+"Where ID=‘200131500145‘";
2
3 //新建连接
4
5 SqlConnection conn=new SqlConnection();
6
7 conn.Connectionstring=connectionString;
8
9 //新建命令对象
10
11 SqlCommand cmd=new SqlCommand(updateQuery,conn);
12
13 // 调用命令对象的ExecuteNonQuery方法
14
15 conn.Open();
16
17 int RecordsAffected=cmd. ExecuteNonQuery();
18
19 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的存储过程,

代码如下:

 1 CREATE PROCEDURE UpdateStudentInfo
2
3 (
4
5   @userName nvarchar(20),
6
7   @user id nvarchar(20);
8
9 )
10
11 AS
12
13   Update studentInfo
14
15   Set sName=@userName Where ID=@user id
16
17 GO

为了执行该存储过程,必须创建一个Command对象并将存储过程的名称传入它的构造函数。

SqlConnection conn=new SqlConnection(connectionString);

SqlCommand cmd=new SqlCommand("UpdateStudentInfo", conn);

接下来要把命令的CommandType属性设置为StoredProcedure。

cmd.CommandType=CommandType.StoredProcedure;

后续步骤和参数化命令是相同的,先设置参数然后执行对应命令。

C#与数据库访问技术之ExecuteNonQuery方法的更多相关文章

  1. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  2. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

  3. C#与数据库访问技术总结(八)之ExecuteNonQuery方法

    ExecuteNonQuery方法 ExecuteNonQuery方法主要用来更新数据. 通常使用它来执行Update.Insert和Delete语句. 该方法返回值意义如下: 对于Update.In ...

  4. c# 窗体开发4 数据库访问技术

    ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...

  5. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  6. C#与数据库访问技术总结(五)之Command对象的常用方法

    Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...

  7. C#与数据库访问技术总结(十六)之 DataSet对象

    DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...

  8. C#与数据库访问技术总结(十三)之DataReader对象

    DataReader对象与数据获取 DataReader对象以“基于连接”的方式来访问数据库. 也就是说,在访问数据库.执行SQL操作时,DataReader要求一直连在数据库上. 这将会给数据库的连 ...

  9. C#与数据库访问技术总结(七)综合示例

    综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...

  10. 数据库访问技术 odbc dao rdo uda jet oledb

    一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...

随机推荐

  1. 二叉搜索树(Binary Search Tree,BST)

    二叉搜索树(Binary Search Tree,BST) 二叉搜索树(Binary Search Tree),也称二叉查找树或二叉排序树,是一种特殊的二叉树,它满足以下性质 对于二叉搜索树的每个节点 ...

  2. 全网最详细Java-JUC

    Java-JUC ⓪基础 ❶进程&线程 进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间. 线程:比进程更小的执行单位,一个进程可以启动多个线程,每条线程并行执行不同的任务 ...

  3. 一个颜值功能双在线的Zookeeper可视化工具

    大家好,我是 Java陈序员,今天给大家介绍一个颜值功能双在线的 Zookeeper 可视化工具. 项目介绍 PrettyZoo 是一个基于 Apache Curator 和 JavaFX 实现的 Z ...

  4. Solution -「洛谷 P5072」「YunoOI 2015」盼君勿忘

    Description Link. 无修支持查询:查询一个区间 \([l,r]\) 中所有子序列分别去重后的和 \(\bmod\ p\) Solution 这是数据结构一百题的第50题(一半了哦)的纪 ...

  5. #POWERBI_指标监控(第二部分,周期内下降天数及日期明细)

    在指标监控的第一部分文章中,我们已经讲了,如何用DAX去查询一段周期内连续下降或者上升指标. 需要复习的同学可以点击下方链接: https://www.cnblogs.com/simone331/p/ ...

  6. .NET周刊【10月第1期 2023-10-01】

    国内文章 .NET应用如何防止被反编译 https://www.cnblogs.com/Can-daydayup/p/17736700.html 本文主要讲述了如何防止.NET应用被反编译.虽然无法完 ...

  7. CSP-S 考前数学练习

    [HAOI2011] 向量 首先将题目转化,转化为求方程: \(k(a,b)+q(b,a)+w(a,−b)+c(b,−a)=(x,y)\) 将这个方程再次化简,即为: \((k+w)a+(q+c)b= ...

  8. FP-Growth算法全解析:理论基础与实战指导

    本篇博客全面探讨了FP-Growth算法,从基础原理到实际应用和代码实现.我们深入剖析了该算法的优缺点,并通过Python示例展示了如何进行频繁项集挖掘. 关注TechLead,分享AI全维度知识.作 ...

  9. 三菱PLC 轻松数采

    目前市面上数采的软件有很多,但是用的最为省力最为简单的就是kepserver了,在kepserver的应用中,有对应的三菱驱动针对于三菱PLC,三菱驱动支持多个Mitsubishi 协议,包括 MEL ...

  10. 2020-2021 “Orz Panda” Cup Programming Contest G题(树形结构)

    题目传送门 题目大意:给点一颗包含 \(n\)个节点的无根树,有 \(m\)次询问,每次询问给出两个点 \(u\)和 \(v\),要求计算 \[\sum_{r=1}^{n}d_{r}(u,v) \] ...