none
ADO.NET入门简介(以SQLSERVER为例) RRS feed

  • 常规讨论

  • 一.ADO.NET介绍

      ADO.NET是在ADO(ActiveX Data Objects)基础上发展的新一代数据存取技术,是微软在.NET平台下提出的新的数据访问模型。通俗些说,ADO.NET就是设计了一系列对各类数据的访问形式,并提供了对应的类,类中提供了与对应数据交互的属性和方法,编程者可以通过这些属性和方法方便的对各种数据源进行存取操作,例如数据库、XML文件等。

    二.  ADO.NET组成

      程序访问数据库方法步骤:
      创建一个到数据库的连接—>打开数据库连接—>创建ADO记录集—>从记录中提取需要的数据—>关闭记录集—>关闭链接

    常见访问类:   a) SqlConnection                —> 数据库连接器
                      b) SqlCommand                  —> 数据库命名对象
                      c) SqlCommandBuilder        —>生成SQL命令
                      d) SqlDataReader                —> 数据读取器
                      e) SqlDataAdapter               —> 数据适配器,填充DataSet
                      f) SqlParameter                   —>为存储过程定义参数
                      g) SqlTransaction                 —> 数据库事物

    三.ADO.NET数据访问对象

      1.SqlConnection对象
      要与数据库打交道,首先必须建立与数据库服务器的连接。ADO.NET使用SqlConnection对象与SQL Server进行连接。在SqlConnection对象中,编程者需要指定一个连接字符串,其格式由一系列关键字和值组成,各关键字之间用分号分隔,关键字不区分大小写。
      与SQL Server 数据库创建连接时,连接字符串的常用形式有下面几种:
      1.1 使用Windows集成安全身份验证,例如:

    Dim connectionString As String = "Integrated Security=SSPI; Database =MyDatabase.mdf; Server=localhost;"

        或者:

    Dim connectionString As String = "Initial Catalog=MyDataBase; Data Source=localhost;Integrated Security=SSPI;"

      连接字符串中的“Database”关键字指定使用的数据库名;“Server”是指提供SQL Server的服务器和SQL Server的实例名。如果使用默认的SQL Server的实例,也可以直接指定服务器名;如果安装SQL Server的服务器是本机,可以写为“localhost”或者“.”,否则可以用IP地址或域名指定服务器。

      1.2 在连接字符串中指定服务器名、用户id、用户口令、数据库名等信息验证,例如:

    Dim connectionString As String = " server=localhost; uid=sa; pwd=123; database=MyDatabase.mdf"

      但是这种连接方式的安全性不高,比较容易受到黑客的攻击。
      如果在本机安装了SQL Server Express,还可以直接使用自动附加数据库名的方式。连接SQL Server的连接字符串的一般形式为:

    Dim connectionString As String = "Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\DatabaseName;" & "Integrated Security=True; Connect Timeout=60; User Instance=True"

      1.3 连接字符串中各项的含义
        1) Data Source
        指定要连接的SQL Server实例的名称。其中“.\SQL”指本机SQL Server数据库服务器。
        2) AttachDbFilename
        指定要附加的数据库文件名。由于字符串中Data Source为“.\SQL”,因此进行连接时系统会自动将指定的数据库文件附加到SQL Server Express中。字符串中的“|DataDirectory|”指项目编译后数据库文件所在的目录,一般与可执行文件(.exe文件)在同一目录下,或者在其子目录下。
        3) Integrated Security
        指定是否使用Windows集成安全身份验证。True表示使用当前的Windows帐户进行身份验证,False表示连接时需要指定用户名和密码。注意,此值一般选择True。除非在安装SQL Server数据库服务器时允许使用用户名密码验证的形式才可以不使用Windows集成安全身份验证。由于使用用户名密码的形式会大大降低系统的安全性,所以建议尽量使用Windows集成安全身份验证。
        4) Connect Timeout
    指定连接超时时间,单位为秒。注意,由于第一次附加数据库到SQL Server Express中需要的时间比较长,所以此值最好大一些,比如60秒。如果不指定,则使用系统默认的超时时间。在默认超时时间下,第一次附加数据库时可能会因为超时时间太短而导致附加失败,显示“超时时间已到……”的错误信息。
        5) User Instance
        指定是否创建实例。如果是SQL Server ,必须选择True,否则就没有对数据库操作的权限。

    2.SqlCommand对象

      与数据源连接后,就可以对数据库中的数据进行插入、删除、查询、更新等操作。在ADO.NET中,有两种操作数据库的方式,一种是采用无连接的方式先将数据库数据读取到本机的DtatSet中,或者直接读取到本机的DataTable中;另一种是在保持连接的方式下通过执行指定的SQL语句完成需要的功能。
        不论采用哪种方式,都可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行的结果。操作命令的类型可以是SQL语句,也可以是存储过程。
        在保持连接的方式下操作数据库的一般步骤为:
        创建SqlConnection的实例—>创建SqlCommand的实例—>打开连接—>执行命令—>关闭连接  
       SqlCommand对象提供了多种完成对数据库操作的方法。常用有

      2.1 ExecuteNonQuery

      该方法执行SQL语句的结果,但不返回命令执行的表数据,仅返回操作所影响的行数。一般将其用于使用UPDATE、INSERT或DELETE语句直接操作数据库中的表数据,但不需要再将数据取出来进行其他处理的场合。

    Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
        Dim connectionString As String = "Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf"
        Dim conn As SqlConnection = New SqlConnection(connectionString)
        Dim cmd As SqlCommand = New SqlCommand()
        cmd.CommandText = "update TableName set 成绩=成绩+10 where 姓名='张三玉'"
        cmd.Connection = conn
        Try
            conn.Open()
            Dim number As Integer = cmd.ExecuteNonQuery()
            MessageBox.Show(String.Format("修改了{0}条记录", number))
        Catch err As Exception
            MessageBox.Show(err.Message, "修改记录失败")
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try
    End Sub

       其中,Close方法的含义为关闭与数据库的连接,并立即释放占用的资源。
       注意,对这段内容,还有另外一种写法,即使用using语句,而不使用Close方法。例如

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim connectionString As String = "Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf"
        Using conn As SqlConnection = New SqlConnection(connectionString)
            Dim cmd As SqlCommand = New SqlCommand()
            cmd.CommandText = "update TableName set 成绩=成绩+10 where 姓名='张三玉'"
            cmd.Connection = conn
            Try
                conn.Open()
                Dim number As Integer = cmd.ExecuteNonQuery()
                MessageBox.Show(String.Format("修改了{0}条记录", number))
            Catch err As Exception
                MessageBox.Show(err.Message, "修改记录失败")
            End Try
        End Using
    End Sub

     一旦using模块结束,系统会立即关闭与对象相关的连接,并立即释放在using中指定的资源。

      2.2 ExecuteReader

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.click
        Dim conn As SqlConnection = New SqlConnection("Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf")
        Dim cmd As SqlCommand = New SqlCommand("select * from TableName ", conn)
        Try
            conn.Open()
            Dim r As SqlDataReader = cmd.ExecuteReader()
            While r.Read() = True
                listBox1.Items.Add(String.Format("[{0}]{1}", r(0), r(1)))
            End While
            r.Close()
        Catch err As Exception
            MessageBox.Show(err.Message, "读取记录失败")
        Finally
            conn.Close()
        End Try
    End Sub

      2.3 ExecuteScaler()

      该方法用于执行SELECT查询,得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。

    Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
        Dim conn As SqlConnection = New SqlConnection("Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf")
        Dim cmd As SqlCommand = New SqlCommand()
        cmd.Connection = conn
        Try
            conn.Open()
            cmd.CommandText = "select count(*) from  TableName where 姓名 like '王%'"
            Dim record As Integer = CInt(cmd.ExecuteScalar())
            cmd.CommandText = "select sum(成绩) from  TableName where 姓名 like '王%'"
            Dim sumValue As Double = Convert.ToDouble(cmd.ExecuteScalar())
            MessageBox.Show(String.Format("有{0}条姓王的记录,合计成绩为{1}", record, sumValue))
        Catch err As Exception
            MessageBox.Show(err.Message)
        Finally
            conn.Close()
        End Try
    End Sub

    3.SqlDataAdapter对象

      在需要大量的数据处理或者动态的数据交互过程的场合,可以使用SqlDataAdapter对象通过无连接的方式完成数据库和本机DataSet之间的交互。该对象通过Fill方法将数据源数据填充到本机DataSet或者DataTable中,填充完成后与数据库服务器的连接就自动断开,然后我们就可以在与数据库服务器不保持连接的情况下对DataSet中的数据表进行浏览、插入、修改、删除等操作。操作完成后,如果需要更新数据库,再利用SqlDataAdapter的Update方法把DataSet或者DataTable中的处理结果更新到数据库中。使用这种方式操作数据库的一般步骤为:

      创建SqlConnection的实例—>创建SqlDataAdapter的实例,需要的话,根据select语句生成其他SQL语句—>创建DataSet的实例—>使用Fill方法将数据库中的表填充到DataSet的表中—>利用DataGridView或者其他控件对象编辑或显示数据—>需要的话,使用Update方法更新数据库

      SqlDataAdapter对象通过SelectCommand、InsertCommand、UpdateCommand和DeleteCommand属性为后台数据库提供对应的操作命令,并传递需要的参数。一般情况下,我们只需要向SqlDataAdapter对象提供SELECT语句和连接字符串参数,然后用SqlCommandBuilder对象让其自动生成InsertCommand、UpdateCommand和DeleteCommand。

    Imports System.Data.SqlClient
    Public Class Form1
        Dim sda As SqlDataAdapter
        Dim CommandeSQLSelect As String
        Private Bind As New BindingSource
        Dim dt As DataTable = New DataTable
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim constr As String = "Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf"
            Dim ConnectionSQL As SqlConnection = New SqlConnection(constr)
            CommandeSQLSelect = "Select * From TableName"
            sda = New SqlDataAdapter(CommandeSQLSelect, ConnectionSQL)
            Dim SQLCommandBuild As SqlCommandBuilder = New SqlCommandBuilder(sda)
            sda.Fill(dt)
            Bind.DataSource = dt
            DataGridView1.DataSource = Bind
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            sda.Update(dt)
        End Sub
    End Class

    上面代码,直接修改DataGridview,按Button键修改数据库。

    4.DataTable对象

      ADO.NET一个非常突出的特点是可以在与数据库断开连接的方式下通过DataSet或DataTable对象进行数据处理,当需要更新数据时才重新与数据源进行连接,并更新数据源。

      DataTable对象表示保存在本机内存中的表,它提供了对表中数据的各种操作。与关系数据库中的表结构类似,

    DataTable对象也包括行、列以及约束等属性。一个表中可以包含多个DataColumn对象,每一个DataColumn对象表示一列,每列也都有一个固定的DataType属性,表示该列的数据类型;除此之外,每个表中也可以包含多行,每一行都是一个DataRow对象。

      我们可以通过编写代码直接将数据从数据库填充到DataTable对象中,也可以将DataTable对象添加到现有的DataSet对象中。在断开连接的方式下,DataSet对象提供了和关系数据库一样的关系数据模型,代码中可以直接访问DataSet对象中的DataTable对象,也可以添加、删除DataTable对象。

    Imports System.Data.SqlClient
    Public Class Form1
        Dim constr As String = "Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf"
        Dim conn As SqlConnection
        Dim sda As SqlDataAdapter
        Dim dt As DataTable
        Dim bind As New BindingSource
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Using conn = New SqlConnection(constr)
                conn.Open()
                sda = New SqlDataAdapter("Select * From TableName", conn)
                dt = New DataTable()
                sda.Fill(dt)
    
            End Using
        End Sub
    End Class

    5.DataSet对象

      与关系数据库中的数据库结构类似,DataSet也是由表、关系和约束的集合组成。就像可以将多个表保存到一个数据库中进行管理一样,也可以将多个表保存到一个DataSet中进行管理,此时DataSet中的每个表都是一个DataTable对象。当多个表之间具有约束关系,或者需要同时对多个表进行处理时,DataSet对象就显得特别重要了。

    Imports System.Data.SqlClient
    Public Class Form1
        Dim constr As String = "Data Source = (localdb)\MSSQLLocalDB; Integrated Security = True ;AttachDbFileName= C:\Users\alexl2\Desktop\DataBase\Alex\alex.mdf"
        Dim conn As SqlConnection
        Dim sda As SqlDataAdapter
        Dim ds As new DataSet
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Using conn = New SqlConnection(constr)
                conn.Open()
                sda = New SqlDataAdapter("Select * From TableName", conn)
                sda.Fill(ds)
                DataGridview1.Datasource=ds.Tables(0)
            End Using
        End Sub
    End Class

    Best Regards,

    Alex


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.








    2018年12月7日 7:47