首页 > 技术文章 > C#使用ADO.NET访问数据库

leadlrc 2020-11-04 22:02 原文

C#使用ADO.NET访问数据库

1.常用的数据库访问技术

  • 开放式互连技术(ODBC)
  • 对象链接与嵌入式数据库技术(OLE DB)
  • Java数据库互连技术(JDBC)
  • ActiveX数据库对象技术(ADO)
  • ADO.NET技术等

2.认识ADO.NET技术

ado.net是一组用于和数据源进行交互的面向对象类库,用于实现用户到SQL Server等数据源的连接,为用户利用SQL语句实现对数据源中数据的查询、处理和更新提供支持。

1.ADO.NET的命名空间及导入

Microsoft将数据类划分成不同的命名空间。在ADO.NET中,主要涉及三个命名空间:

System.Data
System.Data.SqlClient
System.Data.Oledb

用using 导入命名空间,例:

using System.Data;

2.ADO.NET的工作原理及访问架构

ADO.NET是.NET框架中的数据访问模型,包含了两个核心组件:

  • 数据提供程序.NET Framework

    提供程序负责与物理数据源的连接,用于实现对底层数据源的访问

  • 数据集DataSet

    代表实际的数据

ADO.NET的三层数据访问架构:

各种数据库/数据源 <=> .NET数据提供程序 <=> 数据集DataSet

1.各种数据库/数据源

是指物理层的数据存储,可以是SQL Server、Oracle、MySQL、Access等物理数据库/数据源。

2…NET数据提供程序

在.NET数据库应用程序中,用户通过一个.NET的数据提供者同数据库交互

Connection 事务:建立与特定数据源的连接
Command 参数:对数据源执行操作命令(增删改查)
DataReader 以顺序且只读的方式从数据源中读取数据
DataAdapter 数据适配器,使用Command对象对数据源执行SQL命令,将数据从数据库读到数据集
* SelectCommand
* InsertCommand  ======填充=====> DataSet
* DeleteCommand
* UpdateCommand

3.数据集DataSet

可把数据集DataSet看成是内存中的数据库,是专门用来处理从数据库中读出的数据的。

在从数据库完成数据查询后,查询出的数据就存放在DataSet中,它是从数据源中查询到的数据在内存中驻留的表示形式,可以把它看成是内存中的数据库。

因此,DataSet是不依赖于数据库的独立数据集合,即使断开数据链路,或者关闭数据库,DateSet依然是可用的。

3.客户端应用程序基于ADO.NET的两种数据访问模式

1.通过DataSet访问数据(数据集断开式数据访问模式)

是指不直接对数据库进行操作,而是先实现数据库连接,再通过DataAdapter填充DataSet对象,然后客户端再通过读取DataSet来获取需要的数据。同理,在更新数据库中的数据时,也是先更新DataSet,然后再通过DataAdapter来更新数据库中对应的数据。

2.通过DataReader对象访问数据(连接式数据访问模式)

是指客户在操作过程中,与数据库的连接是打开的,使用Command对象对数据库的相关操作,使用DataReader对象以顺序方式读取数据。

3.ADO.NET访问sql的步骤

1.使用连接对象SqlConnection连接数据源

// 定义连接字符串
string str = "Server=DESKTOP-4HSQLSI\\LRC;database=cs172;integrated security=true";
// string str = "Server=DESKTOP-4HSQLSI\\LRC;database=cs172;uid=登录名;pwd=密码";
// stirng str = "Data Source=DESKTOP-4HSQLSI\\LRC;Initial Catalog=cs172;integrated security=true";
/**
* Server等同于Data Source 
* database等同于Initial Catalog
* integrated security=true 表示采用信任模式连接(登录数据库服务器为window身份验证)
* uid=登录名;pwd=密码(登录数据库服务器为SQL server身份验证)
* DESKTOP-4HSQLSI\\LRC 服务器名称
* cs172 要连接的数据库名称
*/
// 定义数据库连接对象并初始化
SqlConnection sqlConn = new SqlConnection(str);

2.打开连接

sqlConn.Open();

3.操作数据库

  • SqlCommand对象的常用属性和方法
属性或方法说明
CommandText 设置或获取在数据源上执行的SQL语句或存储过程名
Connection 设置或返回与Command相关的Connection对象
CreateCommand() 用于建立sqlCommand对象
ExecuteReader() 执行CommandText中的SQL查询语句,查询值返回到DataReader对象
ExecuteScalar() 返回单个值,如求和、求最大值等SQL聚合函数
ExecuteNonQuery() 执行增、删、改等无返回值的SQL操作
  • 增删改:建立SqlCommand对象,执行SQL语句或存储过程对数据进行增删改。

    SqlCommand对象用于通过Connection对数据库下达操作数据库的命令

    // 定义SQL语句字符串(增删改)
    string sql = string.Format("delete from cenJi where xueHao='{0}'", xueHao.Text.Trim());
    // 定义数据库命令对象cmd并初始化
    SqlCommand cmd = new SqlCommand(sql,sqlConn);
    // 执行命令
    cmd.ExecuteNonQuery();
    
  • 查询:建立SqlCommand对象,执行SQL语句或存储过程后对返回的“结果”进行操作:

    • 方法一:使用数据读取器对象DataReader直接一行一行地读取数据集;

      遍历DataReader中的记录

      Command对象在执行ExecuteReader()方法后,在返回记录的同时,将产生一个数据读取器对象DataReader来指向所返回的记录集,利用DataReader就可以读取返回的记录。

      DataReader对象用于以最快的速度检索并检查查询所返回的行,返回的记录是一种只读的且指针只能前移的数据流

     // 定义一个数据读取器对象
    SqlDataReader sqlData = command.ExecuteReader();
     //处理数据读取器sreader中的数据
    // Read()使sqlDataReader移到下一条记录,SqlDataReader的默认位置在第一条记录前面
     if (sqlData.Read())
     {
         xinMin.Text = sqlData["xinMin"].ToString();
    	xinBie.Text = sqlData["xinBie"].ToString();
    	senGao.Text = sqlData["senGao"].ToString();
     }
    //关闭DataReader对象
    sqlData.Close();
    
    • DataReader对象的常用属性和方法
    属性或方法说明
    FieldCount 当前行中的列数

| Item | DataReader中列的值 |
| HasRows | 指出DataReader是否包含一行或多行 |
| Close() | 关闭DataReader对象 |
| GetName() | 获取指定列的名称 |
| GetValue() | 获取指定序号处的列的值 |
| Read() | 使DataReader移到下一条记录,返回True表示还有下一条数据,否则表示数据读取完毕 |

  • 方法二:使用数据集对象DataSet和数据适配器对象DataAdapter来访问数据库。
// sql语句
string sql = "select *from xueSen";
//定义一个数据库适配器对象
SqlDataAdapter sda = new SqlDataAdapter(sql, sqlConn);
//定义一个数据集对象
DataSet dataSet = new DataSet();
//将查询结果填充数据集对象,并用一个表的别名"ds"标记
sda.Fill(dataSet, "ds");
//指定dateGridView的数据源,dataGridView是以表格方式显示数据的控件
dataGridView1.DataSource = dataSet;
dataGridView1.DataMember = "ds";

​ DataAdapter对象(数据适配器对象),是DataSet对象与数据源之间的桥梁,负责从数据源中检索数据,并把检索到的数据填 充到DataSet对象中的表;同时,也把用户对DataSet对象的更改写到数据源中。

​ DataAdapter一般要与DataSet共同使用,来操作数据库中的数据。

  • DataGridView控件的常用属性
属性说明
Columns 所有列的集合
Rows 所有行的集合
DataSource 数据源
DataMember 显示的表的名称
RowCount 获取或设置DataGridview中的显示行
ReadOnly 是否可编辑单元格
SelectedIndex 获取选中行的索引
SelectedRow 获取选中的行

4.关闭连接

//关闭与数据库的连接
sqlConn.Close();

4.具体示例及完整代码

  • 通过vs自带的window窗体来实现
    window窗体

1.“删除”按钮的Click事件代码:

private void button1_Click(object sender, EventArgs e)
{
    // 定义连接字符串
    string str = "Server=DESKTOP-4HSQLSI\\LRC;database=cs172;integrated security=true";
    // string str = "Server=DESKTOP-4HSQLSI\\LRC;database=cs172;uid=登录名;pwd=密码";
    // stirng str = "Data Source=DESKTOP-4HSQLSI\\LRC;Initial Catalog=cs172;integrated security=true";
    /**
                 * Server等同于Data Source 
                 * database等同于Initial Catalog
                 * integrated security=true 表示采用信任模式连接(登录数据库服务器为window身份验证)
                 * uid=登录名;pwd=密码(登录数据库服务器为SQL server身份验证)
                 * DESKTOP-4HSQLSI\\LRC 服务器名称
                 * cs172 要连接的数据库名称
                 */

    // 定义数据库连接对象并初始化
    SqlConnection sqlConn = new SqlConnection(str);
    sqlConn.Open();
    try
    {
        // 定义SQL语句字符串(增删改)
        string sql = string.Format("delete from cenJi where xueHao='{0}'", xueHao.Text.Trim());

        // 定义数据库命令对象cmd并初始化
        SqlCommand cmd = new SqlCommand(sql,sqlConn);

        // 执行命令
        cmd.ExecuteNonQuery();

        MessageBox.Show("删除成功!", "提示");
    }
    catch(Exception i)
    {
        MessageBox.Show(i.ToString(), "错误");
    }
    sqlConn.Close();
}

2.使用SqlCommand对象的ExecuteReader() 方法读取单行数据。该程序根据用户指定的学生学号,查找与该学号对应的学生姓名、性别和身高,并将结果显示在页面上

private void Search_Click(object sender, EventArgs e)
{
    string str = "Server = DESKTOP-4HSQLSI\\LRC;database=cs172;integrated security=true";
    SqlConnection sqlConnection = new SqlConnection(str);
    sqlConnection.Open();
    try
    {
        string sql = "select xinMin,xinBie,senGao from xueSen where xueHao='" + xueHao.Text.Trim() + "'";
        // string sql = string.Format("select xinMin,xinBie,senGao from xueSen where xueHao={0}", 						xueHao.Text.Trim());
        SqlCommand command = new SqlCommand(sql, sqlConnection);

        // 定义一个数据读取器对象
        SqlDataReader sqlData = command.ExecuteReader();

        //处理数据读取器sreader中的数据
        if (sqlData.Read())
        {
            xinMin.Text = sqlData["xinMin"].ToString();
            xinBie.Text = sqlData["xinBie"].ToString();
            senGao.Text = sqlData["senGao"].ToString();
        }
        else
        {
            MessageBox.Show("该学生不存在!", "提示");
        }

        //关闭DataReader对象
        sqlData.Close();

        sqlConnection.Close();
    }
    catch(Exception i)
    {
        MessageBox.Show(i.ToString(), "错误");
    }
}

3.使用SqlDataAdapter和DataSet对象读取数据。该程序将用表格的形式显示stu表中全体学生的详细信息

private void Form1_Load(object sender, EventArgs e)
{
    string str = "Server = DESKTOP-4HSQLSI\\LRC;database=cs172;integrated security=true";
    SqlConnection sqlConn = new SqlConnection(str);
    sqlConn.Open();

    // sql语句
    string sql = "select *from xueSen";

    //定义一个数据库适配器对象
    SqlDataAdapter sda = new SqlDataAdapter(sql, sqlConn);

    //定义一个数据集对象
    DataSet dataSet = new DataSet();

    //将查询结果填充数据集对象,并用一个表的别名"ds"标记
    sda.Fill(dataSet, "ds");

    //指定dateGridView的数据源,dataGridView是以表格方式显示数据的控件
    dataGridView1.DataSource = dataSet;
    dataGridView1.DataMember = "ds";

    //关闭与数据库的连接
    sqlConn.Close();
}

, sqlConn);

//定义一个数据集对象
DataSet dataSet = new DataSet();

//将查询结果填充数据集对象,并用一个表的别名"ds"标记
sda.Fill(dataSet, "ds");

//指定dateGridView的数据源,dataGridView是以表格方式显示数据的控件
dataGridView1.DataSource = dataSet;
dataGridView1.DataMember = "ds";

//关闭与数据库的连接
sqlConn.Close();

}

推荐阅读