第七讲 ADO.NET进行数据库编程

*建立简单数据库程序的一个过程
1、打开数据库连接。
2、执行查询语句并取回记录。
3、关闭数据库连接。

*异常处理
使用try-catch-finally来保证收尾工作
数据库关闭,资源被释放等等。
OleDbConnection dbConn=null;
OleDbDataReader dbReader=null;
try
 {
  dbConn=new OleDbConnection(sConnect);
  dbConn.Open();
  ...
 }
 catch(Exception ex)
 {
   ...
 }
 finally
 {
  try{ dbReader.Close();} catch{...}
  try{ dbConn.Close(); }  catch{...}
 }

*ADO.NET体系结构
 ADO.NET基于Data Provider
 Data Provider封装特定数据库的细节,信息
.NET Programmer-->ADO.NET-->Data Provider-->DB

*Data Provider
.NET 可以支持多种数据提供者:
provider for SQL Server and Oracle
Support for OLEDB & ODBC
其他的Providers:
Oracle,MySQL,IBM,...
http://otn.oracle.com/tech/windows/odpnet/content.html
http://www.mysql.com/,http://crlab.com/mysqlnet/

*对象模型
不同数据库之间
“相同”的编程模型,不管使用何种数据库
不同的数据库连接字符串
不同的名称空间和类:
System.Data.SqlClient.SqlConnection
System.Data.OracleClient.OracleConnection
System.Data.Odbc.OdbcConnection
etc.

*Connection 字符串格式
Connection strings 对于不同的数据库来说是不同的,格式是数据库提供厂商定义的。现在还没有一个很好的文档包

括所有的格式
哪里去寻找帮助?
http://www.connectionstrings.com
http://www.carlprothman.net/Default.aspx?tabid=81

*Executive概要
几种访问数据库的方式:
    任务                       ADO.NET
连接的,读取并返回一个值       ExecuteScalar()
连接的,只读,单向             ExecuteReader()
连接的,只写                   ExecuteNonQuery()
非连接的,读/写                DataSets

*ExecuteScalar
只返回一个值:
string sql;
sql=string.Format("select AcctBalance From Customers Where CID={0}",cid);

SQL.SqlCommand dbCmd;
dbCmd=new SQL.SqlCommand(sql,dbConn);

decimal balance;
balance=System.Convert.ToDecimal(dbCmd.ExecuteScalar());

*ExecuteReader
ExecuteReader 产生一个DataReader对象
DataReader = forward-only,read-only cursor
没被关闭之前都保持数据库的连接
string sql="Select * From Customers;";

SQL.SqlCommand dbCmd=new SQL.SqlCommand(sql,dbConn);
SQL.SqlDataReader dbReader=dbCmd.ExecuteReader();

while( dbReader.Read() )
{...}

*DataSets
DataSets是另一个.NET集合类
特别适合象表格形式存储数据。
简单填充,传递,显示在GUI中

DataSet-->DataAdapter-->Command-->Connection-->DB

*为什么使用DataSet?
DataSet=非连接的记录集
DataSet是服务器端填充为结果的数据拷贝。
DataSet在客户端运行和处理
DataSet可以重新连接数据库用于和、更新数据
好处:
减少DB服务器的负担
关闭连接后离线工作
对于分布式程序是非常重要的...

*填充DataSet
读取并填充DataSet
使用DataAdapter对象
当DataSet被填充之后,与数据库服务器的连接就关闭了!
string sql="Select * From Customers;";

SQL.SqlCommand dbCmd =new SQL.SqlCommand(sql,dbConn);
SQL.SqlDataAdapter dbAdapter=new SQL.SqlDataAdapter(dbCmd);

System.Data.DataSet ds=new System.Data.DataSet();

dbConn.Open();
dbAdapter.Fill(ds);
dbConn.Close();

*DataSets像数据库
无限制的表空间。
可以被查询,排序,更新。
支持视图,关系,约束。

*ExecuteNonQuery
写入数据库
通过SQL动作:插入,更新和删除来对数据库进行写操作。
string sql; int rows;
sql=string.Format("Delete From Customers Where...");
SQL.SqlCommand dbCmd;
dbCmd=new SQL.SqlCommand(sql,dbConn);

dbConn.Open();
rows=dbCmd.ExecuteNonQuery();
dbConn.Close();

if(rows!=1) throw new System.ApplicationException("Delete failed?!");

*DataSets-写入数据库...
DataSet允许非连接的修改
客户端应用程序重新连接后更新
SQL.SqlCommandBuilder dbCmdBuilder;
dbCmdBuilder=new SQL.SqlCommandBuilder(dbAdapter);

ds=(System.Data.DataSet) this.dataGrid1.DataSource;

dbConn.Open();
dbAdapter.Update(ds);
dbConn.Close();
小心:非连接容易引起很多的冲突...

小结:
使用VS的工具来创建数据库连接:
Example:Project menu,Add New Item...,Data Form Wizard
否则,还有一些方法访问数据库:
Need to read a single value? Prefer ExecuteScalar
Need to modify a database?   Prefer ExecuteNonQuery
Need to read a large # of records? Prefer ExecuteReader
Need to read & pass data around?   Perfer a DataSet

补充:参数化查询
参数化的形式
sql="Select * From Customers Where CID=@CID Order By LastName ASC,FirstName ASC;";

SQL.SqlCommand dbCmd;
dbCmd=new SQL.SqlCommand(sql,dbConn);
dbCmd.Parameters.Add("@CID",SqlDbType.Bigint);
dbCmd.Parameters[0].Value=1;
dbReader=dbCmd.ExecuteReader();

*调用存储过程
SQL Server 中的存储过程
Create PROCEDURE GetCustomer(@CID BigInt) as
 Select FirstName,LastName,AcctBalance 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中执行查询
Command对象的BeginTransaction来创建一个Transaction对象

SQL.SqlTransaction txn=dbConn.BeginTransaction();
string strAQL="INSERT INTO Customers VALUES(100,'Hui','Yu',1000000,1000000,'01-Jan-2005','money')";
SQL.SqlCommand dbCmd;
dbCmd=new SQL.SqlCommand(strSQL,dbConn,txn);
int intRecord=dbCmd.ExecuteNonQuery();
if(intRecord==1)
{
 SWF.MessageBox.Show("Update Successful");
 txn.Commit();
}
else
{
 SWF.MessageBox.Show("Update Failed");
 txn.Roolback();
}
 

posted @ 2009-02-28 14:45  teacherzj  阅读(269)  评论(0编辑  收藏  举报