zoukankan      html  css  js  c++  java
  • 第七讲 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();
    }
     

  • 相关阅读:
    解决HTML乱码
    <img> 标签的 src 属性
    tomcat 启动报错 解决办法 A child container failed during&nbsp
    SpringMVC拦截器(资源和权限管理)
    Java实现文件上传-按钮弹出上传页面
    Socket规划中的局域网内测试
    iOS pragma mark要使用
    dwz 照片回头处理
    图像显示和逐渐消失
    讲座:采用Store检查邮件(1)
  • 原文地址:https://www.cnblogs.com/iceberg2008/p/1400280.html
Copyright © 2011-2022 走看看