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):步骤太多,嘴喊类,录下来,按个按钮就播放,所以任命指挥官需要两个要素:执行命令的形式和数据库地址。你记住了吗???

Ado.net总结-Command(指挥官)的更多相关文章

  1. ADO.NET中COMMAND对象的ExecuteNonQuery、ExcuteReader和ExecuteScalar方法

    1.ExecuteNonQuery方法.该方法执行更新操作,即与UPDATE.INSERT.DELETE等语句有关的操作,在这种情况下,返回值是命令影响的行数.对其他语句,如SET或CREATE,则返 ...

  2. 框架设计之ADO.NET Command的ExecuteScalar误用情景及底层解说

    最近下载了点资料,学了学Android,发现Android入门还算简单,从.NET过渡到Android,也就三七十一天的事. 大伙有空也可以学学... 好了,言归正文,那日,有网友发了一个他们公司的数 ...

  3. Java进击C#——语法之ADO.NET

    本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分 ...

  4. ADO.NET 访问数据库

    对数据库的访问时各种数据库应用程序开发的核心技术,.NET框架中提出的ADO.NET技术为应用程序的开发提供了一致的接口,增强了程序的可移植性和可扩展性. a:使用链接对象Connection连接数据 ...

  5. ADO.NET对象模型

    ADO.NET建立在NetFramwork一些核心类的基础之上,可以将这些类分为两组:用于包含于管理数据的容器类与用于连接特定数据源的控制类. 容器类是通用的,无论使用什么样的数据源,都可以使用相同的 ...

  6. ADO.NET数据库编程

    ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...

  7. 语法之ADO.NET

    ADO.NET的概念 由于本系列并不是主讲ADO.NET.所以这里笔者只会教上面定义有线连接方式相关的类.不管如何让我们先看一下ADO.NET类相关联的所有基类吧.这样子也方便我们下面的学习. 下面是 ...

  8. C#中往数据库插入/更新时候关于NUll空值的处理

    本文转载:http://blog.csdn.net/chybaby/article/details/2338943 本文转载:http://www.cnblogs.com/zfanlong1314/a ...

  9. SqlDataReader、SqlDataAdapter與SqlCommand的 区别

    1.SqlDataReader,在线应用,需要conn.open(),使用完之后要关闭. SqlConnection conn = new SqlConnection(connStr); //conn ...

随机推荐

  1. Redis正确使用的十个技巧

    http://www.jb51.net/article/73376.htm Redis 在当前的技术社区里是非常热门的.从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redi ...

  2. [C++] 自动关闭右下角弹窗

    最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...

  3. WebService 基础知识点和用Postman调试

    阅读连接:Retrofit 用Soap协议访问WebService 详解 参考 1.java发HTTP POST请求(内容为xml格式) 2. android解析XML总结(SAX.Pull.Dom三 ...

  4. Nuget 通过 dotnet 命令行发布

    在开发完成一个好用的轮子就想将这个轮子发布到 nuget 让其他小伙伴可以来使用,但是 nuget.org 的登陆速度太慢,本文介绍一个命令行发布的方法,通过命令行发布的方法可以配合 Jenkins ...

  5. 【codeforces 761A】Dasha and Stairs

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法

    1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...

  7. 关于移动端弹层下的body滚动

    关于移动端弹层下的body滚动 这个问题在移动端挺常见的,网上也有一些解决方法,现在笔者来总结一下:css的解决方案都有兼容问题,js是比较稳定的解决方法(虽然比较麻烦) ps: 本文的例子都是用vu ...

  8. java位运算和无符号运算

    计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...

  9. idea启用列模式的方式小结

    (1)alt+鼠标左键----实现的是几个连续列要向上或者向下拉,能够同时操作多行数据. (2)Shift+alt+鼠标左键----可以实现点选跨行的列模式同时操作,而且不通行可以点选不通列,进行跨行 ...

  10. LR性能测试自动化集成JENKINS

    LR11不支持JENKINS集成,解决方案可以使用BAT代替执行,JENKINS定时调用BAT执行性能测试用例.   1. 先随便录制l一个LR脚本,保存为 D:\TEST\test01 2. 打开 ...