zoukankan      html  css  js  c++  java
  • C#与数据库访问技术之ExecuteNonQuery方法

    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;

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

  • 相关阅读:
    Ellipsis 的升级版 line-clamp
    Angular7里面实现 debounce search
    闭包、迭代器
    Day10 函数的进阶
    函数
    文件的操作
    Day 07基础数据补充、set、深浅拷贝
    小数据池,编码和解码
    字典
    列表、元祖的操作
  • 原文地址:https://www.cnblogs.com/KevinBran/p/6765191.html
Copyright © 2011-2022 走看看