zoukankan      html  css  js  c++  java
  • Ado.net总结-Command(指挥官)

    Command

    1. 概述
      在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接。
      SqlCommand 类中常用的构造方法如下表所示:
    构造方法 说明
    SqlCommand() 无参构造方法
    SqlCommand(string commandText,SqlConnection conn) 带参的构造方法,第 1 个参数是要执行的 SQL 语句,第 2 个参数是数据库的连接对象

    对数据库中对象的操作不仅包括对数据表的操作,还包括对数据库、视图、存储过程等数据库对象的操作,接下来主要介绍的是对数据表和存储过程的操作。
    在对不同数据库对象进行操作时,SqlCommand 类提供了不同的属性和方法,常用的属性和方法如下表所示:

    属性或方法 说明
    CommandText 属性,Command 对象中要执行的 SQL 语句
    Connection 属性,获取或设置数据库的连接对象
    CommandType 属性,获取或设置命令类型
    Parameters 属性,设置 Command 对象中 SQL 语句的参数
    ExecuteReader() 方法,获取执行查询语句的结果
    ExecuteScalar() 方法,返回查询结果中第 1 行第 1 列的值
    ExecuteNonQuery() 方法,执行对数据表的增加、删除、修改操作,返回影响的行数
    1. 使用Command类操作数据库
      Command 类中提供了 3 种命令类型,分别是 Text、TableDirect 以及 StoredProcedure,默认情况下是 Text。
      所谓 Text 类型是指使用 SQL 语句的形式,包括增加、删除、修改以及查询的SQL语句。
      StoredProcedure 用于执行存储过程;TableDirect 仅在 OLE DB 驱动程序中有效。
      在使用 Command 类操作数据库时需要通过以下步骤完成。
    1. 创建SqlCommand类的实例
      创建 SqlCommand 类的实例分两种情况,一种是命令类型为 Text 的,一种是命令类型为 StoredProcedure 的。

    命令类型为 Text

    SqlCommand SqlCommand 类的实例名 = new SqlCommand( SQL 语句 , 数据库连接类的实例 );
    

    其中:

    • SQL 语句:指该 SqlCommand 类的实例要执行的 SQL 语句。
    • 数据库连接类的实例:指使用 SqlConnection 类创建的实例,通常数据库连接类的实例处于打开的状态。

    命令类型为 StoredProcedure

    SqlCommand SqlCommand 类的实例名 = new SqlCommand( 存储过程名称 , 数据库连接类的实例 );
    

    需要注意的是,存储过程必须是当前数据库实例中的存储过程,并且在调用带参数的存储过程时,还需要在 SqlCommand 类的实例中添加对应的存储过程参数。
    为存储过程添加参数,需要使用 SqlCommand 类实例的 Parameters 属性来设置,具体的代码如下。

    SqlCommand 类实例 .Parameters.Add( 参数名 , 参数值 );
    
    1. 执行对数据表的操作
      在执行对数据表的操作时通常分为两种情况,一种是执行非查询 SQL 语句的操作,即增加、修改、删除的操作,一种是执行查询 SQL 语句的操作。

    执行非查询 SQL 语句的操作

    在执行非查询 SQL 语句时并不需要返回表中的数据,直接使用 SqlCommand 类的 ExecuteNonQuery 方法即可,该方法的返回值是一个整数,用于返回 SqlCommand 类在执行 SQL 语句后,对表中数据影响的行数。
    当该方法的返回值为 -1 时,代表 SQL 语句执行失败,当该方法的返回值为 0 时,代表 SQL 语句对当前数据表中的数据没有影响。
    例如 要删除学号为 1100 的学生的信息,而表中不存在该学号的学生的信息,SQL语句可以正常执行,但对表中的影响行数是 0。
    具体的代码如下:

    SqlCommand 类的实例 .ExecuteNonQuery();
    

    需要注意的是,如果执行的 SQL 语句在数据库中执行错误,则会产生异常,因此该部分需要进行异常处理。

    执行查询语句的操作

    在执行查询语句时通常需要返回查询结果,SqlCommand 类中提供的 ExecuteReader 方法在执行查询 SQL 语句后,会返回一个 SqlDataReader 类型的值,通过遍历 SqlDataReader 类中的结果即可得到返回值。
    具体的代码如下:

    SqlDataReader dr = SqlCommand 类的实例 .ExecuteReader();
    

    此外,如果在执行查询语句后并不需要返回所有的查询结果,而仅需要返回一个值,例如查询表中的记录行数,这时可以使用 ExecuteScalar 方法。具体的代码如下:

    int returnvalue = SqlCommand 类的实例 .ExecuteScalar();
    

    下面通过实例来演示 SqlCommand 类的使用:

    1. 先创建数据库School,再创建表Student:
    CREATE TABLE [dbo].[Student] (
        [Id]             INT          IDENTITY (1, 1) NOT NULL,
        [Name]           VARCHAR (30) NOT NULL,
        [Age]            INT          NULL,
        [EnrollmentDate] DATE         NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    

    这里如果使用visual studio localdb时,插入中文会出现乱码,解决方法可以参考这篇文章:

    https://blog.csdn.net/xingkongtianyuzhao/article/details/103944280

    1. 下面是使用SqlCmd执行插入命令的示例:

    这里使用了参数化查询SqlParameter,防止了sql注入

    private void btnAddStudent_Click(object sender, EventArgs e)
    {
        string stuName = txtUserName.Text.Trim();
        int stuAge = int.Parse(txtAge.Text.Trim());
        DateTime stuEnrollMentDate = dtpEnrollmentDate.Value;
        string strConn = Properties.Settings.Default.SchoolConn;
        using (SqlConnection conn = new SqlConnection(strConn))
        {
            try
            {
                conn.Open();
                string strSql = "insert into student(name,age,enrollmentdate) values(@name,@age,@enrollmentdate);";
                SqlCommand cmd = new SqlCommand(strSql, conn);
                cmd.Parameters.AddWithValue("@name", stuName);
                cmd.Parameters.AddWithValue("@age", stuAge);
                cmd.Parameters.AddWithValue("@enrollmentdate", stuEnrollMentDate);
                int result = cmd.ExecuteNonQuery();
                if (result != -1)
                {
                MessageBox.Show("注册成功!");
                }
                else
                {
                MessageBox.Show("注册失败!");
                }
            }
            catch (Exception ex)
            {
            	MessageBox.Show(ex.Message);
            }
    
    }
    
    1. 下面是使用SqlCmd执行查询命令的示例:
    private void btnSearchStudent_Click(object sender, EventArgs e)
    {
        string strName = txtStudentName.Text.Trim();
        string strConn = Properties.Settings.Default.SchoolConn;
        using (SqlConnection conn = new SqlConnection(strConn))
        {
            try
            {
                string strSql = "select * from student where name=@name";
                SqlCommand cmd = new SqlCommand(strSql, conn);
                cmd.Parameters.AddWithValue("@name", strName);
                conn.Open();
                var reader = cmd.ExecuteReader();
                //两种方式查询
                while (reader.Read())
                {
    
                    MessageBox.Show("Id: " + reader.GetInt32(0).ToString());
                    MessageBox.Show("姓名: " + reader.GetString(1).ToString());
                    MessageBox.Show("年龄: " + reader.GetInt32(2).ToString());
                    MessageBox.Show("入学日期: " + reader.GetDateTime(3).ToString("yyyy-MM-dd"));
    
                    string result = "Id: " + reader[0] + "姓名:" + reader[1];
                    MessageBox.Show(result);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    

    ** 注意ExecuteScalar,ExecuteNoQuery,ExecuteReader的区别 **

    • ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加、删除和更新),那么方法将返回操作所影响的记录条数。
    • ExecuteScalar():执行命令对象的SQL语句,如果SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略其他的行 和列。该方法所返回的结果为object类型,在使用之前必须强制转换为所需的类型。如果SQL语句不是SELECT查询,则返回结果没有任何作用。
    • ExecuteReader():执行命令对象的SQL语句,在ADO.NET中,就是DataReader 对象的ExecuteReader()方法来进行数据的列出,并且我们用这个ExecuteReader()方法来显示数据是最快的一种方法,只可以一条一条向前读,不能返回。数据连接关闭,reader数据消失。

    ** 记忆:**

    ExecuteNonQuery:Query是查询的意思,NonQuery就是不用于查询,所以ExecuteNonQuery 除了查询,可以执行增删改语句;
    ExecuteScalar: Scalar是游标意思,可以想象成钓鱼的浮标,是用来钓数据的,一般用于查询,而且钓鱼一般一条一条掉,所以只返回第一行第一列的数据;
    ExecuteReader: 阅读数据,想象成图书,从前往后翻页,但是它翻脸不认人,不能从后往前翻页,而且翻脸速度特别快(查询快);
    Command要记住防止SQL注入,最好用参数化查询,就像钓鱼的鱼饵,不同的鱼得用专用鱼饵,投其所好,防止调上水母啥的,鱼饵要放在SqlParameter里面。
    上一节把Command比喻为指挥官,指挥官得知道武器库的地址,所以初始化的时候要给他,SqlConnection;还有指挥命令,Command指挥战斗的两种形式(执行命令):嘴喊(Text),简单直接;录音(StoredProcedure):步骤太多,嘴喊类,录下来,按个按钮就播放,所以任命指挥官需要两个要素:执行命令的形式和数据库地址。你记住了吗???

  • 相关阅读:
    POJ 1691 Painting a Board(状态压缩DP)
    POJ 1946 Cow Cycling(抽象背包, 多阶段DP)
    Leetcode: Best Time to Buy and Sell Stock I, II
    Leetcode: Valid Palindrome
    POJ 1946 Cow Cycling
    POJ 1661 Help Jimmy(递推DP)
    POJ 1160 Post Office(区间DP)
    POJ 2486 apple tree
    Android播放器框架分析之AwesomePlaye
    【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878854.html
Copyright © 2011-2022 走看看