当使用SqlConnection类的Open方法成功连接数据库后,需要使用SqlCommand执行SQL查询数据库操作,一般操作完数据库,建议调用SqlConnection类的Colse方法关闭数据库。
在C#的数据库操作过程中,SqlCommand类一般用于Sqlserver数据库的SQL语句的执行,包括Select语句、Update语句、Delete语句以及SQL存储过程等。
一、SqlCommand类常用属性
CommandText:获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程。
CommandTimeout: 获取或设置在终止执行命令的尝试并生成错误之前的等待时间。
CommandType:获取或设置一个值,该值指示释 CommandText 是SQL语句,存储过程还是表操作。
Connection:获取或设置 SqlCommand 的此实例使用的 SqlConnection。
Parameters:获取 SqlParameterCollection参数集合。
Transaction :获取或设置将在其中执行 SqlCommand 的数据库事务对象 SqlTransaction。
二、SqlCommand类常用方法
ExecuteNonQuery()方法:返回影响的行数,主要用于增删改操作。
ExecuteScalar()方法 :返回第一行第一列,例如我们在计算总条数的时候会使用到此方法。
ExecuteReader()方法:创建一个SqlDataReader用于读取数据,用于查询数据。
ExecuteXmlReader()方法:返回System.XmlReader实例,用于读取SQLServer中的XML字段的值
三、SqlCommand类实战---创建SqlCommand对象
建立一个WEB窗体,添加一个Button按钮(ID名称为Button1),再添加一个TextBox文本框(ID名称为TextBox1),点击按钮如果打开成功,TextBox1文本框上显示出数据库已打开,否则TextBox1文本框上显示打开失败。
数据库创建成功后,创建一个SqlCommand对象sqlcommand,并设置出错时等待时间为2秒。完整的代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
namespace WebApplication32
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
con.Open();
//Response.Write("打开数据库成功!");
TextBox1.Text = "打开数据库成功!";
string sqlcommandStr = "select * from Brand";//创建统计语句
MySqlCommand sqlcommand = new MySqlCommand(sqlcommandStr, con);//创建Command对象
sqlcommand.CommandTimeout = 2;//设置等待时间
Response.Write("创建Command成功");
}
catch (Exception ex)
{
Response.Write(ex.Message);
TextBox1.Text = "打开数据库失败!";
}
finally
{
con.Close();//关闭数据库连接
}
}
}
}
运行结果:
鼠标点Button按钮
四、SqlCommand类实战---ExecuteNonQuery()方法
这个方法没有返回任何结果,一般用于updata,delete,insert等SQL语句,执行完ExecuteNonQuery()方法后,返回受影响的行数。
例:通过ExecuteNonQuery方法修改CarSYS数据库中的Brand数据表中BrandId为1的用户的名称
从上图可以观察到CarSYS数据库中的Brand数据表中BrandId为1的用户的名称为HongQi。下面的代码将CarSYS数据库中的Brand数据表中BrandId为1的用户的名称由HongQi修改为HongQi_2020
string sqlcommandStr = "update Brand set BrandName = 'HongQi_2020' where BrandId = 1";//创建修改SQL语句
建立一个WEB窗体,添加一个Button按钮(ID名称为Button1),再添加一个TextBox文本框(ID名称为TextBox1),点击按钮如果打开成功,TextBox1文本框上显示出数据库已打开,否则TextBox1文本框上显示打开失败。
完整的代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using System.Data;
namespace WebApplication32
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
if (con.State == ConnectionState.Closed)
{
con.Open();
TextBox1.Text = "打开数据库成功!";
}
string sqlcommandStr = "update Brand set BrandName = 'HongQi_2020' where BrandId = 1";//创建修改SQL语句
MySqlCommand sqlcommand = new MySqlCommand(sqlcommandStr, con);//创建Command对象
//执行SQL语句并返回受影响的行数
int number = sqlcommand.ExecuteNonQuery();
string message = number > 0 ? "修改信息成功!" : "修改信息失败!";
Response.Write(message);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
}
}
总之,如果受影响的行数>0,就表示更新成功。
五、SqlCommand类实战---ExecuteScalar()方法
使用ExecuteScalar方法()方法可以以标量值的形式返回结果集中第一行第一列的值。例如:下面使用COUNT(*)聚合函数
来返回数据库中的总记录条数。
建立一个WEB窗体,添加一个Button按钮(ID名称为Button1),再添加一个TextBox文本框(ID名称为TextBox1),点击按钮如果打开成功,TextBox1文本框上显示出数据库已打开,否则TextBox1文本框上显示打开失败。
完整的代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using System.Data;
namespace WebApplication32
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
if (con.State == ConnectionState.Closed)
{
con.Open();
TextBox1.Text = "打开数据库成功!";
}
string sqlcommandStr = "select COUNT(*) from Brand";//创建统计语句
MySqlCommand sqlcommand = new MySqlCommand(sqlcommandStr, con);//创建Command对象
sqlcommand.Connection = con;
int sum = Convert.ToInt32(sqlcommand.ExecuteScalar());
string message = string.Format("Brand表中共有{0}条记录", sum);
Response.Write(message);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
}
}
运行结果如下:
六、SqlCommand类实战---ExecuteReader()方法
我们已经知道,使用SqlCommand的ExecuteNonQuery()方法执行SQL语句可以返回受影响的行数,使用SqlCommand的
ExecuteScalar()方法从数据库中检索单个值,那么要想从数据库中读取多条记录怎么办呢? 可以使用SqlCommand对象的ExecuteReader()方法,这个方法返回一个SqlDataReader对象,通过这个SqlDataReader对象程序就可以从数据库中读取多条记录了。
使用SqlDataReader对象可以从数据库中检索只读数据,其每次从查询结果中读取一行到内存中。使用SqlDataReader读取数据时,不能够对其进行修改,因为它是只读的。而且在读取数据时,要始终保持与数据库的连接。
SqlDataReader对象中的Read()方法将读取器前进到结果集中的下一个记录。
使用SqlDataReader的步骤如下:
第一步:创建SqlCommand对象
第二步:调用SqlCommand对象的ExecuteReader()方法创建SqlDataReader对象。
假如已经有了一个名为sqlcommand的SqlCommand对象,可以这样创建一个SqlDataReader对象
MySqlDataReader reader = sqlcommand.ExecuteReader();
第三步:使用SqlDataReader对象的Read()方法逐行读取数据。
这个方法返回一个布尔值,如果能读取下一行,返回True,否则返回False。
第四步:读取当前行的某列数据。
可以像使用数组一样,用方括号来读取某列的值,如果(type)dataReader[]
使用SqlDataReader对象读取数据库时会占用数据库连接,必须调用Close()方法关闭SqlDataReader,才能用数据库连接进行其它操作。
下面的代码查询CarSYS数据库中的Brand数据表中的BrandId字段<100 的所有记录。
建立一个WEB窗体,添加一个Button按钮(ID名称为Button1),再添加一个TextBox文本框(ID名称为TextBox1),点击按钮如果打开成功,TextBox1文本框上显示出数据库已打开,否则TextBox1文本框上显示打开失败。
完整的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
namespace WebApplication32
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
con.Open();
TextBox1.Text = "打开数据库成功!";
string sqlcommandStr = "select * from Brand where BrandId < 100";//创建统计语句
MySqlCommand sqlcommand = new MySqlCommand(sqlcommandStr, con);//创建Command对象
sqlcommand.Connection = con;
MySqlDataReader reader = sqlcommand.ExecuteReader();//ExecuteReader返回的对象类型是SqlDataReader
{
//Read是bool类型,初始指针指向第一条数据之前,每调用一次reader,指针就下移一条,只要没有移到最后一条之后,就返回true。
while (reader.Read())
{
int t = (int)reader.GetUInt32(0);//GetString(1)得到表中第一列的值,用name接收,因为查的是*,所以就和表中的列数一样。
string name = reader.GetString(1);
Response.Write("Brand数据表中的数为:" + t.ToString() + "-" + name);
}
reader.Close();
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
}
}
程序运行前数据库内容如下:
运行结果:
说明:使用ExecuteReader()方法读出的数据,可以通过 MySqlDataReader.Read()方法一行一行的读,每调用一次reader,指针就下移一条,只要没有移到最后一条之后,就返回true。当移到最后一条,就返回false.
七、总结
ExecuteNonQuery用于执行不返回任何记录的SQL语句或存储过程。在数据库执行如更新、插入、删除操作时,应使用这个方法。ExecuteNonQuery返回一个整数值,用来说明受查询语句影响的行数。
ExecuteScalar与ExecuteNonQuery一样,其返回的也是单值,但该返回值是从数据库中读出来的,而不是受影响的行数。它通常用于选择一个值的SQL语句。如果SELECT返回多行或多列,则使用该方法仅返回第一行第一列的数据。
ExecuteReader被用于返回多条记录的SELECT语句(包含任意个字段)。ExecuteReader将返回一个包含查询结果的SqlDataReader对象。一个SqlDataReader对象是以顺序向前且只读的形式逐个读取并返回结果的。SqlDataReader是数据库中读取数据最快的对象,但必须打开连接。通过SqlDataReader取回所有的记录,并把它们存入DataTable对象中(它可以存储离线数据而不需要一个打开的连接),这样就可以马上关闭数据库连接了。DataTable类可以存放本地的结果集而不需要一个打开的SQL Server连接,和其它的ADO.NET对象一样,它也不是特定于某种数据提供程序的。
八、SqlCommand总结
用SqlConnection类打开数据库成功后,就需要用SqlCommand类对数据库执行增加、删除、修改、查询的工作。
要使用SqlCommand对象,必须要先定义一个可用的SqlConnection对象,使用SqlCommand对象的步骤如下:
第一步:用SqlConnection对象创建数据库的连接。
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
con.Open();
第二步:定义执行的SQL语句。
例如:
string sqlcommandStr = "select * from Brand where BrandId < 100";
第三步:创建SqlCommand对象
使用已有的SqlConnection对象和SQL语句字符串创建一个SqlCommand对象。
例如:
string sqlstr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
MySqlConnection con = new MySqlConnection(sqlstr);//创建一个SqlConnection对象
con.Open();
string sqlcommandStr = "select * from Brand where BrandId < 100";//创建SQL统计语句
MySqlCommand sqlcommand = new MySqlCommand(sqlcommandStr, con);//创建Command对象
sqlcommand.Connection = con;
第四步:执行SQL语句。
这里需要使用SqlCommand对象的某个方法(ExecuteNonQuery()方法、ExecuteScalar()方法或ExecuteReader()方法)来执行命令。
例如:
MySqlDataReader reader = sqlcommand.ExecuteReader();//ExecuteReader返回的对象类型是SqlDataReader
https://www.cnblogs.com/zzj-suxiao/articles/3934805.html
https://www.cnblogs.com/xu-yi/p/11186536.html
学习笔记(一)ADO.Net中Sqlconnection与Sqlcommand的应用