Connection对象是一个连接对象,主要功能是建立与物理数据库的连接。
以SQL Server为例,如果要连接SQL Server数据库,则必须使用System.Data.SqlClient
命名空间下的SqlConnection
类。
string connStr = "server=10.98.100.113;database=LTTCERPMAIN;uid=erpdba;pwd=s@fe201Oen0ugh";
SqlConnection conn = new SqlConnection(connStr);
conn.Open(); //打开连接
public override ConnectionState State { get; }
枚举类型:ConnectionState,其值包含Connecting、Open及Closed等。
//判断当前连接状态
if (conn.State == ConnectionState.Open)
{
MessageBox.Show("连接数据库成功");
}
conn.Close();
//or
conn.Dispose(); //关闭连接
二者区别:
- Close方法用于关闭一个连接;而Dispose方法不仅关闭一个连接,而且还清理连接所占用的资源。
- 当使用Close方法关闭连接后,可以再调用Open方法打开连接,不会产生任何错误;而使用Dispose方法关闭连接,就不可以再次直接用Open方法打开连接,必须重新初始化连接再打开。
谨记:编写应用程序时,对数据库操作完成后,要及时关闭数据库的连接,以防止在对数据库进行其他操作时,数据库被占用。
Command对象是一个数据命令对象,主要功能是向数据库发送查询、更新、删除、修改操作的SQL语句。
Command对象有3个重要的属性,分别是Connection属性、CommandText属性和CommandType属性。
用于设置SqlCommand使用的SqlConnection
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
用于设置要对数据源执行的SQL语句或存储过程等,默认为执行SQL语句。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.CommandText = "select * from userTest where age > 10"; //设置CommandText属性,要执行的SQL语句
用于设置指定CommandText的类型。枚举类型:CommandType,其值包括Text、StoredProcedure及TableDirect,默认为Text。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.CommandType = CommandType.Text; //SQL文本命令:Text,使其只执行SQL语句文本形式
cmd.CommandType = CommandType.StoredProcedure; //存储过程的名称:StoredProcedure,使其执行存储过程
cmd.CommandType = CommandType.TableDirect; //表的名称:TableDirect,使其处理某个表
根据
CommandType
属性的取值来决定CommandText
属性的取值,分为3种情况:
- 如果
CommandType
属性取值为Text
,则CommandText
属性指出SQL语句的内容。- 如果
CommandType
属性取值为StoredProcedure
,则CommandText
属性指出存储过程的名称。- 如果
CommandType
属性取值为TableDirect
,则CommandText
属性指出表的名称。
使用SqlCommand向数据库发送增、删、改命令时,通常使用ExecuteNonQuery方法执行发送的SQL语句,返回受影响的行数。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
cmd.CommandText = "update userTest set address='测试' where id=1"; //设置CommandText属性,要执行的SQL语句
cmd.CommandType = CommandType.Text; //设置CommandType属性为Text,使其只执行SQL语句文本形式
int count = cmd.ExecuteNonQuery(); //执行SQL语句
MessageBox.Show(count.ToString()); //返回结果为1
执行查询操作,返回一个具有多行多列的结果集,即生成一个包含数据的SqlDataReader对象的实例。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
cmd.CommandText = "select * from userTest"; //设置CommandText属性,要执行的SQL语句
cmd.CommandType = CommandType.Text; //设置CommandType属性为Text,使其只执行SQL语句文本形式
SqlDataReader sdr = cmd.ExecuteReader(); //使用ExecuteReader方法实例化一个SqlDataReader对象
while (sdr.Read()) //循环读取SqlDataReader,输出用户名称
{
MessageBox.Show(sdr["name"].ToString());
}
执行查询操作,返回单个值,即返回结果集中第一行的第一列。,通常与聚合函数一起使用。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
cmd.CommandText = "select name from userTest"; //设置CommandText属性,要执行的SQL语句
cmd.CommandType = CommandType.Text; //设置CommandType属性为Text,使其只执行SQL语句文本形式
object obj = cmd.ExecuteScalar(); //执行SQL语句,返回第一行第一列值
MessageBox.Show(obj + ""); //输出结果:杭三
DataReader对象是数据读取器对象,提供只读向前的游标,如果应用程序需要每次从数据库中取出最新数据,或者只需要快速读取数据,并不需要修改数据,则可以使用DataReader对象进行读取。
在使用DataReader对象读取数据时,可以使用ExecuteReader方法,根据SQL语句的结果创建一个SqlDataReader对象,然后再调用SqlDataReader对象的Read方法读取数据。
string connStr = "server=10.98.100.113;database=LTTCERPMAIN;uid=erpdba;pwd=s@fe201Oen0ugh";
SqlConnection conn = new SqlConnection(connStr); ////创建一个SqlConnection对象,连接数据库
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
cmd.CommandText = "select * from userTest"; //设置CommandText属性,要执行的SQL语句
cmd.CommandType = CommandType.Text; //设置CommandType属性为Text,使其只执行SQL语句文本形式
SqlDataReader sdr = cmd.ExecuteReader(); //使用ExecuteReader方法实例化一个SqlDataReader对象
while (sdr.Read()) //循环读取SqlDataReader,输出用户名称
{
MessageBox.Show(sdr["name"].ToString());
}
注意:在使用SqlDataReader对象之前,必须打开数据库连接。如果针对一个SqlConnection,创建多个SqlDataReader对象,则创建下一个SqlDataReader对象之前,要通过Close方法关闭上一个SqlDataReader对象。
通过SqlDataReader对象的HasRows属性获取一个值,用于指示SqlDataReader是否包含一行或多行,即判断查询结果中是否有值,如果有值,HasRows为true;否则,HasRows为false。
SqlCommand cmd = new SqlCommand(); //创建一个SqlCommand对象
cmd.Connection = conn; //设置Connection属性
cmd.CommandText = "select * from userTest"; //设置CommandText属性,要执行的SQL语句
cmd.CommandType = CommandType.Text; //设置CommandType属性为Text,使其只执行SQL语句文本形式
SqlDataReader sdr = cmd.ExecuteReader(); //使用ExecuteReader方法实例化一个SqlDataReader对象
if (sdr.HasRows)
{
MessageBox.Show("查询结果中有值!");
}
DataAdapter对象是一个数据库适配器对象,是DataSet与数据源之前的桥梁。其包含4个属性:
- SelectCommand属性:向数据库发送查询SQL语句。
- InsertCommand属性:向数据库发送插入SQL语句。
- UpdateCommand属性:向数据库发送更新SQL语句。
- DeleteCommand属性:向数据库发送删除SQL语句。
//dataSet:要用记录和架构填充的DataSet; srcTable:用于表映射的源表名称
public int Fill(DataSet dataSet, string srcTable)
返回值:已在DataSet中成功添加或刷新的行数,这不包括受不返回行的语句影响的行数。
使用方法如下:
private void button2_Click(object sender, EventArgs e)
{
//创建SqlConnection对象,连接数据库
string connStr = "server=10.98.100.113;database=LTTCERPMAIN;uid=erpdba;pwd=s@fe201Oen0ugh";
SqlConnection conn = new SqlConnection(connStr);
//创建SqlCommand对象,执行SQL语句,查询测试用户数据
SqlCommand cmd = new SqlCommand("select * from userTest", conn);
//创建SqlDataAdapter对象,并设置SelectCommand属性,向数据库发送查询SQL语句
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = cmd;
//通过Fill方法将查询结果填充到DataSet中
DataSet ds = new DataSet();
sda.Fill(ds, "table_01");
dataGridView1.DataSource = ds.Tables[0];
}
Update方法更新数据库时,DataAdapter将调用DeleteCommand、InsertCommand以及UpdateCommand属性。
//dataTable:用于更新数据源的DataTable
public override int Update(DataSet dataSet)
返回值:DataSet中更新成功的行数。
在调用Update方法之前,要实例化一个CommandBuilder类,它能自动根据DataAdapter的SelectCommand的SQL语句判断其他的InsertCommand、UpdateCommand和DeleteCommand,因此,直接使用Update方法即可更新数据。
使用方法如下:
private void button3_Click(object sender, EventArgs e)
{
//获取测试用户表数据
DataTable dt = dataGridView1.DataSource as DataTable;
//添加一行数据
DataRow drNew = dt.NewRow();
drNew["name"] = "王五";
drNew["sex"] = "男";
drNew["age"] = 25;
drNew["address"] = "王府井xxx";
dt.Rows.Add(drNew);
//创建SqlConnection对象,连接数据库
string connStr = "server=10.98.100.113;database=LTTCERPMAIN;uid=erpdba;pwd=s@fe201Oen0ugh";
SqlConnection conn = new SqlConnection(connStr);
SqlTransaction tran = null;
try
{
//创建SqlDataAdapter对象,并设置SelectCommand属性,向数据库发送查询SQL语句
SqlDataAdapter sda = new SqlDataAdapter("select * from userTest", conn);
//实例化一个SqlCommandBuilder对象
SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(sda);
//打开数据库连接,更新数据源,插入一行数据
conn.Open();
tran = conn.BeginTransaction();
sda.SelectCommand.CommandTimeout = 600;
sda.SelectCommand.Transaction = tran;
sda.Update(dt);
tran.Commit();
}
catch (Exception ex)
{
tran?.Rollback();
MessageBox.Show(ex.Message);
}
finally
{
//关闭数据库连接
conn.Close();
}
}