C#语言中通过ADO.NET组件实现数据库链接以及操作数据库的功能。ADO.NET则通过调用对应的类实现这些功能。包括:Connection、Command、DataReader、DataSet等。本文就对这些类的功能详细介绍。另外在调用这些类时,需要在 System.Data.SqlClient 命名空间下操作。
使用Connection类实现此功能,实现数据库的连接、断开以及当前数据库连接状态。可定义数据库连接串连接任意数据库。例如 SQLServer、Oracle、MySQL 等。
属性或方法 | 说明 |
---|---|
SqlConnection() | 无参构造方法 |
SqlConnection(string connectionstring) | 带参数的构造方法,数据库连接字符串作为参数 |
Connectionstring | 属性,获取或设置数据库的连接串 |
State | 属性,获取当前数据库的状态,由枚举类型 Connectionstate 为其提供值 |
ConnectionTimeout | 属性,获取在尝试连接时终止尝试并生成错误之前所等待的时间 |
DataSource | 属性,获取要连接的 SQL Server 的实例名 |
Open() | 方法,打开一个数据库连接 |
Close() | 方法,关闭数据库连接 |
BeginTransaction() | 方法,开始一个数据库事务 |
编写连接字符串。语法格式如下:
Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; User ID = 用户名 ; Password = 密码
其中如果使用 Windows 身份验证的方式登录数据库时,则不需要输入登录用户和密码。但考虑到数据库安全性,不建议。其语法格式如下:Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; Integrate Security = True
属性或方法 | 说明 |
---|---|
Data Source | 用于指定要访问数据库的数据库实例名,服务器名称可以换成 IP 地址或者数据库所在的计算机名称 |
Initial Catalog | 要访问数据库实例下的数据库名 |
User ID | 登录到指定 SQL Server 数据库实例的用户,比如sa |
Password | 与 登录用户对应的密码 |
2.创建SQLConnection类实例
语法格式:SqlConnection 连接对象名 = new SqlConnection( 数据库连接串 );
多嘴说一句,C#为面向对象编程,类在C#为抽象体,是对某种实物的抽象化,但在使用时,需要对某个具体的对象进行编程,因此需要对类进行实例化。举个例子,比如汽车可以理解为类,但如果我要对我的汽车进行操作。需要调用汽车这个类,然后实例化出我的汽车,才能对我的汽车进行相关操作。
3.打开数据库
语法格式如下:连接对象名.Open();
创建 SqlConnection 连接类的实例后并没有连接上数据库,需要使用连接类的 Open 方法打开数据库的连接。
在使用 Open 方法打开数据库连接时,可通过Connection属性方法中State来判断状态。
状态 | 返回值 | 描述 |
---|---|---|
Closed | 0 | 连接已关闭。 |
Connecting | 2 | 连接对象正在连接到数据源。 |
Open | 1 | 连接已打开。 |
4.数据库操作
和数据库链接后,可以对数据库进行操作,包括数据查询、修改等。
5.数据库关闭
语法格式:连接对象名.Close(); 在完成数据库的操作后,为了节省数据库的连接资源,需要关闭数据库连接。
//编写数据库连接串
string connStr = "Data source= 服务器名称.;Initial Catalog=数据库名称;User ID=用户名;Pwd=用户密码";
//创建SqlConnection的实例
SqlConnection conn = new SqlConnection(connStr);
//打开数据库连接
conn.Open();
if(conn.State == 1)
{
MessageBox.Show("数据库连接成功!");
}
else
{
MessageBox.Show("数据库连接失败!");
}
#region DataOpera
//数据库操作代码
#endregion
conn.Close();//关闭数据库
数据库操作包括数据的查询、修改(增减删改)、读取。用到的类包括Command、DataReader、DataSet、DataTable等
用的的类包括Command类、DataReader类、DataSet类、DataTable类。通过调用每个类的属性方法完成以上操作。
在进行数据库的操作时,需要先通过Connection连接数据库。
对数据库对象的操作,包括对数据表以及对数据库、视图、存储过程等数据库对象的操作
Command类 在 System.Data.SqlClient 命名空间下对应的类名是 SqlCommand。
构造方法 | 说明 |
---|---|
SqlCommand() | 无参构造方法 |
SqlCommand(string commandText,SqlConnection conn) | 带参的构造方法,第 1 个参数是要执行的 SQL 语句,第 2 个参数是数据库的连接对象 |
属性或方法 | 说明 |
---|---|
CommandText | 属性,Command 对象中要执行的 SQL 语句 |
Connection | 属性,获取或设置数据库的连接对象 |
CommandType | 属性,获取或设置命令类型 |
Parameters | 属性,设置 Command 对象中 SQL 语句的参数 |
ExecuteReader() | 方法,获取执行查询语句的结果,返回满足条件的所有查询结果 |
ExecuteScalar() | 方法,返回查询结果中第 1 行第 1 列的值,主要是返回某一数值 |
ExecuteNonQuery() | 方法,执行对数据表的增加、删除、修改操作 |
ExecuteScalar
如果影响行数为0的话,则证明操作是不成功的,大于0则证明操作成功。
返回数值规则返回第一列,第一行的数据。比如查询行数
如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。
如果有第一行,但是第一列为空,那么返回的是 DBNull 。
如果一行都没有,那么ExecuteScalar就返回null
返回值的数据类型是object,需要尽管转换为Int或String
ExecuteNonQuery
对于Update、insert、Delete语句执行成功是返回值为该命令所影响的行数,如果影响的行数是0,则返回值就是0;
对于所有其他类型的语句,返回值为-1;
如果发生回滚,返回值也为-1;
如果执行异常,会返回报错信息
1.创建Command类实例,语法格式如下:
SqlCommand SqlCommand 类的实例名 = new SqlCommand( SQL 语句 , 数据库连接类的实例 );
2.编写SQL语句。
可参考SQL语句的编写规则,SQL语句命令主要分查询型和非查询型。
3.执行对数据表的操作。
数据表操作主要分两种:1数据查询 (a返回某一数值,比如查询某一行数b返回符合查询条件的所有结果)2.数据的操作(增减删改)
1.a 返回某一数值,比如查询某用户名是否已存在数据库中。语法类型为:
int returnvalue = SqlCommand 类的实例 .ExecuteScalar();
对应返回值可参考上文ExecuteScalar的属性介绍。再通过返回值进行逻辑判断
1.b 返回符合查询条件的所有查询结果,比如查询数学成绩大于60的同学用户名。语法类型:
SqlDataReader SqlDataReader类的实例名 = SqlCommand 类的实例 .ExecuteReader();
实例化对象后,调用实例名,读取需要的数据。
这里需要调用DataReader类读取查询结果。并且只能以只读方式读取的(即不能修改 DataReader 中存放的数据)
2.数据的操作。比如某一数据的插入、修改、删除等。语法类型:
int returnvalue = SqlCommand 类的实例 .ExecuteNonQuery();
对应返回值可参考上文ExecuteNonQuery的属性介绍。再根据返回值进行逻辑判断
用于读取表中的查询结果,并且是以只读方式读取的(即不能修改 DataReader 中存放的数据)。
具有访问数据的速度比较快,占用的服务器资源比较少特点。
当查询结果仅为一条时,可以使用 if 语句查询 DataReader 对象中的数据,
如果返回值是多条数据,需要通过 while 语句遍历 DataReader 对象中的数据。
DataReader 在 System.Data.SqlClient 命名空间下对应的类名是 SqlDataReader。
无
属性或方法 | 说明 |
---|---|
FieldCount | 属性,获取当前行中的列数 |
HasRows | 属性,获取 DataReader 中是否包含数据 |
IsClosed | 属性,获取 DataReader 的状态是否为已经被关闭 |
Read | 方法,让 DataReader 对象前进到下一条记录 |
Close | 方法,关闭 DataReader 对象 |
Get XXX (int i) | 方法,获取指定列的值,其中XXX代表的是数据类型。例如获取当前行第1列 double 类型的值,获取方法为GetDouble(o) |
SqlDataReader SqlDataReader类的实例名=SqlCommand 类实例 .ExecuteReader();
2.遍历 SqlDataReader 中的结果。语法结构如下:
while(SqlDataReader类的实例名.Read())
{
//数据读取
}
SqlDataReader 类中提供的 Read 方法用于判断其是否有值,并指向 SqlDataReader 结果中的下一条记录。
如果返回值为 True,则可以读取该条记录,否则无法读取。在读取记录时,要根据查询结果表中的数据类型来读取表中相应的列。
3.关闭 SqlDataReader。语法结构如下:
SqlDataReader类的实例名.Close();
将数据表中的数据查询出来并添加到 DataSet 中,然后在DataSet类或DataTab类中对查询的数据进行修改操作。这也是区别DataReader类。DataAdapter 在 System.Data.SqlClient 命名空间下对应的类名是 SqlDataAdapter。
构造方法 | 说明 |
---|---|
SqlDataAdapter(SqlCommand cmd) | 带参数的构造方法,传递 SqlCommand 类的对象作为参数 |
SqlDataAdapter(string sql, SqlConnection conn) | 带参数的构造方法,sql 参数是指定对数据表执行的 SQL 语句,conn 是数据库的连接对象 |
SqlDataAdapter() | 不带参数的构造方法 |
属性或方法 | 说明 |
---|---|
SelectCommand | 属性,设置 SqlDataAdapter 中要执行的查询语句 |
InsertCommand | 属性,设置 SqlDataAdapter 中要执行的添加语句 |
UpdateCommand | 属性,设置 SqlDataAdapter 中要执行的修改语句 |
DeleteCommand | 属性,设置 SqlDataAdapter 中要执行的删除语句 |
Fill(DataSet ds) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataSet 对象中 |
Fill(DataTable dt) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataTable 对象 中,DataTable是数据表对象,在一个DataSet对象中由多个 DataTable对象构成 |
Update(DataSet ds) | 方法,更新 DataSet 对象中的数据 |
Update(DataTable dt) | 方法,更新 DataTable 对象中的数据 |
DataAdapter需要和DataSet/DataTable一起使用。
1.创建DataAdapter类实例化。语法规则如下
SqlDataAdapter SqlDataAdapter 类的实例名 = new SqlDataAdapter( SQL 语句 , 数据库连接类的实例 );
2.创建DataSet类实例化,语法规则如下:
DataSet DataSet类的实例名 = new DataSet();
3.将SQLDataAdapter 类对象查询结果填充到Dataset对象中
SqlDataAdapter 类的实例名 .Fill(DataSet类的实例名);
类似数据库结构的数据集,每个 DataSet 都是由多个 DataTable 构成的,更新 DataSet 中的数据实际上是通过更新 DataTable 来实现的。每个 DataTable 对象都是由行 (DataRow) 和列 (DataColumn) 构成的,其结构关系如下
此外,用户还可以通过 DataRelation 类设置数据表之间的关系。
构造方法 | 说明 |
---|---|
DataSet() | 无参构造方法 |
DataSet(string DataSetName) | 带参数的构造方法,DataSetName 参数用于指定数据集名称 |
属性或方法 | 说明 |
---|---|
Tables | 属性,获取 DataSet 中所有数据表的集合,Tables[0] 代表集合中的第一个数据表 |
CaseSensitive | 属性,获取或设置 DataSet 中的字符串是否区分大小写 |
Relations | 属性,获取 DataSet 中包含的关系集合 |
Clear() | 方法,清空 DataSet 中的数据 |
Copy() | 方法,复制 DataSet 中的数据 |
AcceptChanges() | 方法,更新 DataSet 中的数据 |
HasChanges() | 方法,获取 DataSet 中是否有数据发生变化 |
RejectChanges() | 方法,撤销对 DataSet 中数据的更改 |
1.创建DataAdapter类实例化。语法规则如下
SqlDataAdapter SqlDataAdapter 类的实例名 = new SqlDataAdapter( SQL 语句 , 数据库连接类的实例 );
2.创建DataSet类实例化,语法规则如下:
DataSet DataSet类的实例名 = new DataSet();
3.将SQLDataAdapter 类对象查询结果填充到Dataset对象中
SqlDataAdapter 类的实例名 .Fill(DataSet类的实例名);
DataTable 作为 DataSet 中的重要对象,其与数据表的定义是类似的,都是由行和列构成,并有唯一的表名。
中可以将数据直接填充到 DataTable 中,这样既能节省存储空间也能简化查找数据表中的数据。
构造方法 | 说明 |
---|---|
DataTable() | 无参构造方法 |
DataTable(string TableName) | 带参数的构造方法, TableName 参数用于指定数据表的名称 |
属性 | 说明 |
---|---|
TableName | 属性,获取或设置 DataTable 的名称 |
Columns | 属性,获取 DataTable 中列的集合 |
Rows | 属性,获取 DataTable 中行的集合 |
DataSet | 属性,获取 DataTable 所在的 DataSet |
Constraints | 属性,获取 DataTable 中的所有约束 |
大部分方法和DataSet类一样,上面的为DataTable类独有的。
1.创建DataAdapter类实例化。语法规则如下
SqlDataAdapter SqlDataAdapter 类的实例名 = new SqlDataAdapter( SQL 语句 , 数据库连接类的实例 );
2.创建DataTable类实例化,语法规则如下:
DataTable DataTable类的实例名 = new DataTable();
3.将SQLDataAdapter 类对象查询结果填充到DataTable对象中
SqlDataAdapter 类的实例名 .Fill(DataTable类的实例名);
代表数据表中的行,并允许通过该类直接对数据表进行添加、修改、删除行的操作
通过 DataTable 中的 NewRow 方法创建 DataRow 类的对象,语法规则如下
DataTable DataTable的实例名 = new DataTable();
DataRow DataRow的实例名 = DataTable的实例名.NewRow();
属性或方法 | 说明 |
---|---|
Table | 属性,设置 DataRow 对象所创建 DataTable 的名称 |
RowState | 属性,获取当前行的状态 |
HasErrors | 属性,获取当前行是否存在错误 |
AcceptChanges() | 方法,更新 DataTable 中的值 |
RejectChanges() | 方法,撤销对 DataTable 中的值的更新 |
Delete() | 方法,标记当前的行被删除,并在执行 AcceptChanges 方法后更新数据表 |
1.创建DataTable类的对象和表名。语法规则
private DataTable DataTable的实例名 = new DataTable(“数据表名”);
2.添加DataTable数据表的列,设置列的属性,包括数据类型、名称等。并添加到DataTable数据表中
DataColumn 列名 = new DataColumn(“列名”, typeof(数据类型));
dt.Columns.Add(列名);
3.添加数据,即修改表行的数据。并添加到DataTable数据表中
DataRow dr = dt.NewRow();
dr[“name”] = textBox1.Text;
dt.Rows.Add(dr);
是数据表中的列对象,与数据库中表的列定义一样,都可以为其设置列名以及数据类型
构造方法 | 说明 |
---|---|
DataColumn() | 无参构造方法 |
DataColumn(string columnName) | 带参数的构造方法,columnName 参数代表的是列名 |
DataColumn(string columnName,Type dataType) | 带参数的构造方法,columnName 参数代表的是列名,dataType 参数代表的是列的数据类型 |
属性 | 说明 |
---|---|
ColumnName | 属性,设置 DataColumn 对象的列名 |
DataType | 属性,设置 DataColumn 对象的数据类型 |
MaxLength | 属性,设置 DataColumn 对象值的最大长度 |
Caption | 属性,设置 DataColumn 对象在显示时的列名,类似于给表中的列设置别名 |
DefaultValue | 属性,设置 DataColumn 对象的默认值 |
AutoIncrement | 属性,设置 DataColumn 对象为自动增长列,与 SQL Server 中数据表的标识列类似 |
AutoIncrementSeed | 属性,与 AutoIncrement 属性联用,用于设置自动增长列的初始值 |
AutoIncrementStep | 属性,与 AutoIncrement 属性联用,用于设置自动增长列每次增加的值 |
Unique | 属性,设置 DataColumn 对象的值是唯一的,类似于数据表的唯一约束 |
AllowDBNull | 属性,设置 DataColumn 对象的值是否允许为空 |
1.创建DataTable类的对象和表名。语法规则
private DataTable DataTable的实例名 = new DataTable(“数据表名”);
2.添加DataTable数据表的列,设置列的属性,包括数据类型、名称等。并添加到DataTable数据表中
DataColumn 列名 = new DataColumn(“列名”, typeof(数据类型));
dt.Columns.Add(列名);
3.添加数据,即修改表行的数据。并添加到DataTable数据表中
DataRow dr = dt.NewRow();
dr[“name”] = textBox1.Text;
dt.Rows.Add(dr);
CSDN
Github