ADO.net体系结构
Connection对象:
string sConnect;
sConnect = string.format("Provider={0};DataSource={1}{2}","Microsoft.Jet.OLEDB.4.0;",System.AppDomain.CurrentDomain.BaseDirectory,"Sale.mdb");
MSA.OLEDbconnection dbConn;
dbConn = new MSA.OleDbConnection(sConnect);
dbConn.Open();
……
SWF.MessageBox.Show(dbConn.State.ToString());
//显示“Open”。
Command and Reader对象
string sql;BankCustomer c;
sql="select * from Customers"
MSA.OleDbCommand dbCmd;
dbCmd = new MSA.OleDbCommand(sql,dbConn);
MSA.OleDbDataReader dbReader;
dbReader = dbCmd.ExecuteReader();
while(dbReader.Read())
{
c = new BandCustomer(dbReader["FirstName"].ToString,dbReader["Lastname"].ToString,System.Convert.ToDecimal(dbReader["AcctBalance"]));
Globals.Customers.Add(c);
}
ADO.net 基于Data Provider。Data Provider 封装基于特定数据库的细节信息。.net可支持多种数据提供者,如SQL Server、Oracle、OleDb、ODBC等。
不管使用何种数据库,都具有相同的编程模型,但要使用不同的数据库连接字符串,使用不同的名称空间和类。
连接字符串参考资源:
http://www.connectionstrings.com。
几种访问数据库的方式:
连接的,读取并读取一个值:ExecuteScalar()
连接的,只读,单向:ExecuteReader()
连接的,只写:ExecuteNonQuery()
非连接的,读/写:DataSets
为什么使用DataSet?
DataSet是非连接的记录集,是服务器端填充为结果的数据拷贝;在客户端运行和处理;可以重新连接数据库用于更新数据。
好处:减少DB服务器的负担,关闭连接后可以离线工作,对于分布式应用程序是很必要的。
例如:
foreach (System.Data.DataRow row in ds.Tables["Table"].Rows)
{
……
}
写入数据
通过SQL动作:插入、更新和删除来对数据库进行写操作:
string sql;int rows;
sql= string.Format("Delete from Customers Where...");
SQL.SqlCommand dbCmd;
dbCmd = new SqlCommand(sql,dbConn);
dbConn.Open();
rows = dbCmd.ExecuteNonQuery();
dbConn.Close();
if (rows!=1) throw new System.ApplicationException("Delete failed?!");
非连接的修改:重新连接数据库后更新。如:
SQL.SqlCommandBuilder dbCmdBuilder;
dbCmdBuilder = new SQL.SqlCommandBuilder(dbAdapter);
ds = (System.Data.DataSet) this.dataGrid1.DataSource;
dbConn.Open();
dbAdapter.Update(ds);
dbConn.Close();
注意,非连接更新可能会引起冲突。
参数化查询:
Select FirstName,Lastname from Customers where CID=@CID
使用时——
dbCmd.Parameters.Add("@CID",SqlDbType.BigInt);
dbCmd.Parameter[0].Value=1;
dbReader = dbCmd.ExecuteReader();
调用存储过程
Create PROCEDURE GetCustomer(@CID BigInt) as
Select * from Customers Where CID=@CID
RETURN
SQL.SqlCommand dbCmd= dbConn.CreateCommand();
dbCmd.CommandText = "GetCustomer";
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.Parameters.Add("@CID",SqlDbType.BigInt);
dbCmd.Parameters[0].Value=1;
dbReader = dbCmd.ExecuteReader();
Transaction中执行查询
Connection对象的BeginTransaction来创建一个Transaction对象。
SQL.SqlTransaction txn= dbConn.BeginTransaction();
string sql= "..."
SQL.SqlCommand dbCmd;
dbCmd = new SQL.SqlCommand(strSQL,dbConn,txn);
int intRecord = dbCmd.ExecteNonQuery();
if(intRecord==1)
{
//成功
txn.Commit();
}
else
{
//失败
txn.Rollback();
}
参考资源:《ADO.net技术内幕》