Ado.net总结-Command(指挥官)
Command
- 概述
在 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() | 方法,执行对数据表的增加、删除、修改操作,返回影响的行数 |
- 使用Command类操作数据库
Command 类中提供了 3 种命令类型,分别是 Text、TableDirect 以及 StoredProcedure,默认情况下是 Text。
所谓 Text 类型是指使用 SQL 语句的形式,包括增加、删除、修改以及查询的SQL语句。
StoredProcedure 用于执行存储过程;TableDirect 仅在 OLE DB 驱动程序中有效。
在使用 Command 类操作数据库时需要通过以下步骤完成。
- 创建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( 参数名 , 参数值 );
- 执行对数据表的操作
在执行对数据表的操作时通常分为两种情况,一种是执行非查询 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 类的使用:
- 先创建数据库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
- 下面是使用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);
}
}
- 下面是使用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(指挥官)的更多相关文章
- ADO.NET中COMMAND对象的ExecuteNonQuery、ExcuteReader和ExecuteScalar方法
1.ExecuteNonQuery方法.该方法执行更新操作,即与UPDATE.INSERT.DELETE等语句有关的操作,在这种情况下,返回值是命令影响的行数.对其他语句,如SET或CREATE,则返 ...
- 框架设计之ADO.NET Command的ExecuteScalar误用情景及底层解说
最近下载了点资料,学了学Android,发现Android入门还算简单,从.NET过渡到Android,也就三七十一天的事. 大伙有空也可以学学... 好了,言归正文,那日,有网友发了一个他们公司的数 ...
- Java进击C#——语法之ADO.NET
本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分 ...
- ADO.NET 访问数据库
对数据库的访问时各种数据库应用程序开发的核心技术,.NET框架中提出的ADO.NET技术为应用程序的开发提供了一致的接口,增强了程序的可移植性和可扩展性. a:使用链接对象Connection连接数据 ...
- ADO.NET对象模型
ADO.NET建立在NetFramwork一些核心类的基础之上,可以将这些类分为两组:用于包含于管理数据的容器类与用于连接特定数据源的控制类. 容器类是通用的,无论使用什么样的数据源,都可以使用相同的 ...
- ADO.NET数据库编程
ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...
- 语法之ADO.NET
ADO.NET的概念 由于本系列并不是主讲ADO.NET.所以这里笔者只会教上面定义有线连接方式相关的类.不管如何让我们先看一下ADO.NET类相关联的所有基类吧.这样子也方便我们下面的学习. 下面是 ...
- C#中往数据库插入/更新时候关于NUll空值的处理
本文转载:http://blog.csdn.net/chybaby/article/details/2338943 本文转载:http://www.cnblogs.com/zfanlong1314/a ...
- SqlDataReader、SqlDataAdapter與SqlCommand的 区别
1.SqlDataReader,在线应用,需要conn.open(),使用完之后要关闭. SqlConnection conn = new SqlConnection(connStr); //conn ...
随机推荐
- Redis正确使用的十个技巧
http://www.jb51.net/article/73376.htm Redis 在当前的技术社区里是非常热门的.从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redi ...
- [C++] 自动关闭右下角弹窗
最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...
- WebService 基础知识点和用Postman调试
阅读连接:Retrofit 用Soap协议访问WebService 详解 参考 1.java发HTTP POST请求(内容为xml格式) 2. android解析XML总结(SAX.Pull.Dom三 ...
- Nuget 通过 dotnet 命令行发布
在开发完成一个好用的轮子就想将这个轮子发布到 nuget 让其他小伙伴可以来使用,但是 nuget.org 的登陆速度太慢,本文介绍一个命令行发布的方法,通过命令行发布的方法可以配合 Jenkins ...
- 【codeforces 761A】Dasha and Stairs
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法
1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...
- 关于移动端弹层下的body滚动
关于移动端弹层下的body滚动 这个问题在移动端挺常见的,网上也有一些解决方法,现在笔者来总结一下:css的解决方案都有兼容问题,js是比较稳定的解决方法(虽然比较麻烦) ps: 本文的例子都是用vu ...
- java位运算和无符号运算
计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...
- idea启用列模式的方式小结
(1)alt+鼠标左键----实现的是几个连续列要向上或者向下拉,能够同时操作多行数据. (2)Shift+alt+鼠标左键----可以实现点选跨行的列模式同时操作,而且不通行可以点选不通列,进行跨行 ...
- LR性能测试自动化集成JENKINS
LR11不支持JENKINS集成,解决方案可以使用BAT代替执行,JENKINS定时调用BAT执行性能测试用例. 1. 先随便录制l一个LR脚本,保存为 D:\TEST\test01 2. 打开 ...