C#笔记:ADO.Net(九)

Evernote Export


 
.................................. ADO.Net技术.................................
 
ADO.NET是访问数据库的一种技术
ADO.Net中常见的命名空间
数据库提供程序
System.Data.SqlClient
SQL SERVER
System.Data.OracleClient
Oracle
System.Data.Odbc
ODBC
 
"select"查询的数据主要有两种存储方式:
1. 使用 SqlDataReader sqlDataReader = sqlCommand.ExecuteReader() 存放到 SqlDataReader 中 [ 只读,速度快,与数据库保持连接]
SqlConnection, SqlCommand, SqlDataReader
[SqlCommand对象用 sqlConnection.CreateCommand(); sqlDataReader对象只能用sqlCommand.ExecuteReader(); ]
2. 使用 sqlDataAdapter.Fill(dataSet) 存放到 DataSet / DataTable 中 [ 能够修改,即 增、删、改 ]
SqlConnection, SqlDataAdapter, DataSet / DataTable
[SqlDataAdapte对象一般用newSqlDataAdapte(string sql, SqlConnection conn)]
 
SqlCommand 和 SqlDataAdapter 执行SQL命令; SqlDataReader和 DataSet 存储数据
连接数据库用到的五个类
作用
SqlConnection [ 连接类 ],
需Close()
用于数据库中建立或者断开连接的操作
SqlCommand [ 命令类 ]
调用不同的方法来执行SQL语句,完成增,删,改,查操作
只是查询时,需要借助 SqlDataReader类 来存储查询的数据
SqlDataReader [ 数据阅读器类 ]
需Close()
存放 sqlCommand.ExecuteReader() 从数据库中查询出来的数据
[ 只读,且只能向前读;与数据库断开连接,对象中的值会被清除 ]
[ 访问速度快,占用资源少 ],需要 Close()
SqlDataAdapter [ 数据适配器类 ]
可以看做是数据库与 DataSet / DataTable 的一个桥梁,
不仅可以把 数据存储到 DataSet / DataTable [sqlDataAdapter.Fill(dataTable)]
还可以把 更改后的 DataSet / DataTable保存到数据库 [newSqlCommandBuilder(sqlDataAdapter)]
DataSet [ 数据集类 ]
/
DataTable [ 数据表类 ]
[DataColumn, DataRow]
1.DataSet / DataTable 相当于C#中的 数据库和表
2.查询的数据不仅可以存放到 SqlDataReader 中,还可以存放到 DataSet / DataTable中,但是需要借助 SqlDataAdapter对象 将数据存储到 DataSet/DataTable
3.DataSet / DataTable 可以对数据进行修改 [ 增、删、改 ],使用 SqlCommandBuilder对象提交修改
 
 
using关键字作用
1.引用命名空间
2.释放资源;会自动调用 using( ) 作用 对象的 Dispose方法,释放资源
 

 
.................................. 1. SqlConnection .................................
SqlConnection类 对数据库中的数据表、视图和存储过程进行操作
构造函数
描述
 
SqlConnection()
 
一:创建类的实例,给 connectionString 属性赋值
SqlConnection(string connection)
参数为 连接字符串
二:创建类实例的时候,直接传入连接字符串
属性
描述
 
connectionString
获取/设置 连接字符串
 
State
获取当前数据库的连接状态
 
DataSource
获取要连接的 SQL Server 实例名
 
方法
描述
 
Open( )
打开一个数据库连接
 
Close( )
关闭一个数据库连接
 
BeginTransacton( )
开启一个数据库事务
 
CreateCommand()
创建并返回一个 SqlCommand 对象
 
 
 
 
连接字符串的书写
第一种:string connectionString = "Data Source=服务器名; Initial Catalog=数据库名; Integrated Security=False; User ID=用户名; Password=密码; "
第二种:string connectionString = "Server=服务器名; database=数据库名; Integrated Security=False; uid=用户名; pwd =密码; "
[可以混合用]
 
与数据库连接分为3步: 创建 SqlConnection类的实例 ---> 打开数据库连接 ---> 关闭数据库连接
 
1.创建 SqlConnection类的实例
SqlConnection sqlConnection = newSqlConnection(connString);
/
SqlConnection sqlConnection = newSqlConnection();
sqlConnection.Connectionstring="xxxxxx";
 
 
2.打开数据库连接
sqlConnection.Open()
 
 
3.关闭数据库连接
sqlConneciton.Close()
/
using( SqlConnectionsqlConnection = newSqlConnection(连接字符串) )
{
..........
}
 
 
 

 
.................................. 2. SqlCommand .................................
 
构造方法
描述
SqlCommand()
 
SqlCommand(string commandText,SqlConnection conn)
第一个参数:要执行的 SQL语句
第二个参数:SqlConnection 对象
属性
描述
CommandType
获取/设置命令的类型
[ Text:SQL文本命令 存储过程的名字:StoredProcedure ]
CommandText
获取/设置对数据库执行的SQL语句或存储过程
Parameters
Command对象中SQL语句参数或存储过程参数的集合
.Parameters.AddWithValue(string 参数名称,object 参数值)
 
方法
描述
ExecuteReader()
查询数据,返回 SqlDataReader对象
执行查询语句,返回一个 SqlDataReader类 对象
ExecuteScalar()
查询是否有数据,返回第一行第一列的值
执行查询语句,返回结果集中第一行第一列的值,没有返回 null
ExecuteNonQuery()
执行修改,返回受影响的行数
实现 增、删、改对数据表的更新操作,返回 int,受影响的行数
[ -1:执行失败 0:没有影响
 
 
使用 SqlCommand 类操作数据库分为3步:创建 SqlCommand 类的实例 --> 设置需要执行的命令 --> 执行方法执行命令
 
1.创建 SqlCommand类的实例
SqlCommand sqlCommand = sqlConnection.CreateCommand();
SqlCommand sqlCommand = newSqlCommand(commandText, sqlConnection);
 
// 只能执行SQL的文本命令,不能执行存储过程
string commandText = "select id,password from userinfo where name='{0}' and id ='{1}';
commandText = string.Format(cSql, this.utxt1.text,this.utxt2.text); // string类的静态方法
SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection);
 
------------------------------------------------
 
 
2.设置需要执行的命令
//执行的SQL文本命令
sqlCommand.CommandType = CommandType.Text; // 默认的,类型为 SQL文本命令,可以不用写
sqlCommand.CommandText = " update customer set name = @Name where code = @Code ";
sqlCommand.Parameters.AddWithValue("@Name", "CT002_name");
sqlCommand.Parameters.AddWithValue("@Code", "CT002");
 
//执行的是存储过程
sqlCommand.CommandType = CommandType.StoredProcedure; // 类型的存储过程
sqlCommand.CommandText = "customer_Get"; // 存储过程的名称
sqlCommand.Parameters.AddWithValue("@Ukey", ukey); //存储过程的参数
sqlCommand.Parameters.AddWithValue("@Subtype", this._subtype);
 
 
3.执行方法执行命令
//执行的是查询语句
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader( ); // 返回查询的结果集
/
var returnValue = sqlCommand.ExecuteScalar( ); // 返回结果集中第一行第一列的值
 
//执行的增、删、改
int reutrnValue = sqlCommand.ExecuteNonQuery(); // 返回受影响的行数,int
 
 
 

 
.................................. 3. SqlDataReader .................................
没有提供构造函数,通过 sqlCommand.ExecuteReader() 方法来创建对象
属性
描述
int FieldCount
结果集中的列数
bool HasRows
是否有数据
bool IsClose
DataReader 是否被关闭
方法
描述
Read( )
返回bool,使指针指向下一行记录,指针默认在第一条记录之前
IsDBNull(int i)
给定列序号,判断当前行,该列的值是否为 NULL,返回bool
GetOrdinal( stirng str )
给定列名,返回列序号 int i
sqlDataReader[ int i ]
不是方法
int i:为列序号,当前记录第 i 列的值
GetString( int i )
GetDateTime( int i )
GetDecimal( int i )
GetBoolean( int i )
GetXXX
给定列序号,返回指定列的值
XXX为该列的数据类型
[ 需要知道该列的数据类型 ]
if(!sqlDataReader.IsDBNull(sqlDataReader.GetOrdinal( "subtype" )))
{
string subtype = sqlDataReader.GetString( sqlDataReader.GetOrdinal( "subtype" ) )
}
Close( )
要 Close( ), sqlDataReader不能为 NULL
 
 
 
读取 SqlDataReader 中的数据分为3步:借助SqlCommand.ExecuteReader()创建对象 --> 使用Read()移动指针 ---> 关闭 SqlDataReader 对象
 
1.借助SqlCommand.ExecuteReader()创建对象
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
 
 
2.使用Read()方法每次读取一行数据
// 每次读取一行记录,只需要读取一行记录,用 if 语句
if (sqlDataReader.Read())
{
if (!sqlDataReader.IsDBNull(sqlDataReader.GetOrdinal( "subtype" )))
{
// 方式一
string msg =“用户编号” + sqlDataReader[0] + “密码” + sqlDataReader[1];
 
//方式二
string msg =“用户编号” + sqlDataReader[sqlDataReader.GetOrdinal("ukey")];
 
// 方式三
stringsubtype = sqlDataReader.GetString( sqlDataReader.GetOrdinal( "subtype" ))
}
}
 
// 每次读取一行记录,需要读取所有记录,用 while循环
while ( sqlDataReader.Read())
{
string msg =“用户编号” + sqlDataReader[0] + “密码” + sqlDataReader[1];
}
 
 
3.关闭 SqlDataReader 对象
sqlDataReader.Close( )
/
using( SqlDataReader sqlDataReader = sqlCommand.ExecuteReader( ))
{
.....
}
 
 
 
 

 
 
总结:读取数据存到 sqlDataReader 对象中 [SqlConnection,SqlCommand,SqlDataReader;]
string connectionString = @"Data source=LI-PC\SQL2014;Initial Catalog=li_try;User ID=SA;Password=123456";
using (SqlConnectionconn = newSqlConnection(connectionString))
{
conn.Open();
 
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = CommandType.Text;
cmd.CommandText = "select * from prodtry where ukey= @Ukey";
cmd.Parameters.AddWithValue("@Ukey","1");
 
using(SqlDataReader = cmd.ExecuteReader())
{
while(dr.Read())
{
if (!dr.IsDBNull(dr.GetOrdinal("cost1")))
{
stringmsg = "Cost1:" + dr[1].ToString();
MessageBox.Show(msg);
}
}
}
}
 
 
 
总结:使用 SqlCommand() 提交修改 [ SqlConnection,SqlTransaction,SqlCommand,都是conn创建对象 ]
 
string connectionString = @"Data source=LI-PC\SQL2014;Initial Catalog=li_try;User ID=SA;Password=123456";
using (SqlConnectionconn = newSqlConnection(connectionString))
{
conn.Open();
// 调用 conn.BeginTransaction(), 连接要开启
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted); // 开启事务并保持共享锁
try
{
SqlCommand cmd = conn.CreateCommand();
cmd.Transaction = trans; // 将创建的SqlTransaction对象分配给要执行的sqlCommand的Transaction属性
cmd.CommandType = CommandType.Text;
 
// 只能出现一次 @gradename1
cmd.CommandText = "insert into grade values(@gradename1)";
cmd.Parameters.AddWithValue(@gradename1, "111");
cmd.ExecuteNonQuery();
 
cmd.CommandText = "insert into grade values(@gradename2)";
cmd.Parameters.AddWithValue(@gradename2, "111");
cmd.ExecuteNonQuery();
 
cSql = "insert into warehouse (ukey, warehouse, desc1,isdefa) values('{0}', '{1}', '2', {3})";
cSql = string.Format(cSql, "1", "1", "1", 1);
cmd.CommandText = cSql;
cmd.ExecuteNonQuery();
// -----------------
 
trans.Commit();
MessageBox.Show("成功");
}
catch (Exception)
{
trans.Rollback();
MessageBox.Show("失败");
}
}
 
 
 
 
 

 
.................................. 4. SqlDataAdapter,DataSet,DataTable .................................
 
DataSet 类是一种与数据库结构类似的数据集,
每个 DataSet 都是由若干个数据表构成的,DataTable 即数据表,
每个 DataTable 也都是由行和列构成的,行使用 DataRow 类表示、列使用 DataColumn 类表示。
更改 DataSet 的值,是通过 更改 DataTable中的 DataRow 和 DataColumn 来实现
SqlDataAdapter中有数据,把SqlDataAdapter中的数据填充到 DataSet / DataTable
构造函数
描述
SqlDataAdapter()  
SqlDataAdapter(SqlCommand cmd)
参数为 SqlCommand 对象
SqlDataAdapter(string sql,SqlConnecion conn)
sql:SQL语句 conn:SqlConnection 对象
属性
描述
SelectCommand
获取/设置要执行的 查询语句
InsertCommand
获取/设置要执行的 增加语句
UpdateCommand
获取/设置要执行的 修改语句
DeleteCommand
获取/设置要执行的 删除语句
方法
描述
Fill(DataSet ds)
将 SqlDataAdapter 查询的数据填充到 DataSet 对象 中
Fill(DataTable dt)
将 SqlDataAdapter 查询的数据填充到 DataTable类 对象 中
Update(DataSet ds)
对dataRow的RowState等于deleted/inserted/updated
会执行其 DeleteCommand...等 方法对数据源进行更新
Update(DataTable dt)
 
 
DataSet类
 
构造方法
描述
DataSet()
 
DataSet(string DataSetName)
DataSetName:创建的数据集的名称
属性
描述
Tables
DataSet所有数据表的集合,Tables[0]:代表第一张数据表
方法
描述
Clear()
清空 DataSet 中的数据
HasChanges()
判断 DataSet 是否有数据发生更改,返回 bool
.Tables[0]的属性
 
.Tables[0].Rows.
一个表的列集合,
.Tables[0].Columns.
一个表的列集合, Columns["name"] 指定列名
.Tables[0].NewRow()
返回 DataRow对象
.Tables[0].Rows.Add(DataRow dr)
dc: DataColumn 对象,无返回值 [ 创建 DataColumn实例设置其属性 ]
.Tables[0].Rows.Remove(DataRow dr)
dr: DataRow实例,直接删除
.Tables[0].Rows.RemoveAt(index)
index,行的索引,直接删除
.Tables[0].Rows[index].Delete()
标记删除,
需要用 AcceptChanges()确认删除,也可用 RejectChanges()撤销标记[不用也行]
 
 
.Tables[0].Columns.Add(DataColumn dc)
 
.Tables[0].Columns.Remove(DataColumn dc)
 
.Tables[0].Columns.RemoveAt(index)
 
 
 
.Tables[0].AcceptChanges()
更新 DataSet 中的数据
.Tables[0].RejectChanges()
撤销对 DataSet 中数据的更改
 
DataTable类 与 DataSet类有很多相同的属性和方法
构造方法
描述
DataTable()
 
DataTable(string DataTableName)
DataTabelName:创建的数据表的名称
方法
描述
DataTable 没有 HasChanges( ),其他都一样
 
DataRow类 : 对数据表进行 增、删、改 操作
没有构造函数,只能通过 dataTable.NewRow()创建 对象
 
1. DataRow dataRow = dataTable.NewRow();
2. dr[ 编号或列名 ]= 值的形式即可为表中的列赋值。
 
DataColumn类: 对数据表进行 增、删、改 操作
构造方法
描述
DataColumn( string columnName )
参数是 列名
DataColumn( string columnName, Type dataType )
 
DataColumn id = newDataColumn("id", typeof(int));
DataColumn name = newDataColumn("name", typeof(string));
参数是 列名 和 列类型
属性
描述
ColumnName
列名
DataType
列类型
MaxLength
列长度
DefaultValue
默认值
bool AutoIncrement
int AutoIncrementSeed
int AutoIncrementStep
自动增长列
初始值
步长
 
SqlCommandBulider 类
为 sqlDataAdapter 创建代码自动生成器
构造函数
描述
SqlCommandBuilder(SqlDataAdapter sqlDataAdapter)
将 DataSet/DataTable 的数据更新到 SqlDataAdater
 
创建 DataRow 对象的方法
1. DataRow dr = dt.Rows[0]; [现有]
2. DataRow dr = dt.NewRow(); [新增]
 
一般增加的都是 [新增] 行,删除的都是 [现有] 行
 
 
新增行
1. DataRow集合对象的 dt.Rows.Add(DataRow)
 
一个DataRow对象刚被创建之后其状态是Detached
当修改了这个DataRow后,这个DataRow状态转为Modified
通过DataTable.Rows.Add(DataRow)方法将此DataRow添加到DataTable,DataRow 的状态就转变为 Added
 
 
删除行
1: DataRow 对象的 dt.Rows[0].Delete() [ 改变状态 RowState=Deleted,标记为删除; 用DataTable.Rows.Count查看行数,跟删除前是一样的 ]
2: DataRow集合对象的 dt.Rows.Remove(DataRow) / .RemoveAt(index)
 
 
将 DataSet 或 DataTable 与 SqlDataAdapter 和关系型数据源一起使用时:
SqlDataAdapter.Fill(DataSet/DataTable) 会自动调用 .AcceptChanges();
 
SqlDataAdapter.Update(): 对dataRow的RowState等于deleted/inserted/updated 会执行其 DeleteCommand... 方法对数据源进行更新
即:如果使用 Remove() 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行
dt.AcceptChanges(): 对 Table 的数据进行更新
 
 
总结:使用 SqlDataAdapter 来 查询或者修改数据,都是用 "select" 语句,"select" 不仅能查询数据还能查询表结构
 
 
一个事务修改一个 DataTable
string connectionString = @"Server=LI-PC\SQL2014; Initial Catalog=kentex; Integrated Security=yes;";
using (SqlConnectionconn = newSqlConnection(connectionString))
{
conn.Open();
 
string cSql = $"select * from warehouse where warehouse = '2' "; // 没数据也没关系,能查询出结构
DataTable dt = newDataTable();
SqlDataAdapter da = newSqlDataAdapter(cSql, conn);
da.Fill(dt);
 
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted); // 开启事务并保持共享锁
try
{
da.SelectCommand = newSqlCommand(cSql, conn, trans);
 
// ----------------------------------------
// Delete [Delete不会影响行数,只是做标记]
dt.Rows[0].Delete();
 
 
// New
DataRow drNew = dt.NewRow();
drNew["ukey"] = "123456";
drNew[1] = "123456";
drNew[2] = "123456";
dt.Rows.Add(drNew);
 
// Update
DataRow drUpdate = dt.Rows[0];
drUpdate["uKey"] = "123";
drUpdate[1] = "G";
// ----------------------------------------
 
SqlCommandBuilder commandBuilder = newSqlCommandBuilder(da);
da.Update(dt);
 
trans.Commit();
DevExpress.XtraEditors.XtraMessageBox.Show("存档成功", "Customer", MessageBoxButtons.OK);
}
catch (Exception exp)
{
DevExpress.XtraEditors.XtraMessageBox.Show("存档失败" + exp.ToString(), "Customer", MessageBoxButtons.OK, MessageBoxIcon.Error);
trans.Rollback();
}
}
 
 

 

 
 
 
 
 
 
 
 
posted @ 2021-03-11 09:31  大李子"  阅读(153)  评论(0)    收藏  举报