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=@CIDRETURN
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技术内幕》