从SQL获取数据并转换为变量

时间:2014-04-19 01:50:00

标签: sql vb.net ms-access-2007

NET并使用MS Access作为数据库。我正在尝试从SQL获取数据并将其放在变量中并将其打印在消息框中以确认该变量保存数据。但是,当我运行我的代码时,它会给我一个错误消息并突出显示

Dim conn As New OleDbConnection and conn.Open()

"An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll

Additional information: The ConnectionString property has not been initialized."

enter image description here

它不运行sql查询。请帮我解决这个问题。的Merci。

 Imports System.Data.OleDb
    Public Class ModifyForm
        Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= c:\Databse\Company_db.accdb"
        Dim conn As New OleDbConnection


    Private Sub eNumText_SelectedIndexChanged(sender As Object, e As EventArgs) Handles eNumText.SelectedIndexChanged

            Dim empNum As String
            Dim empFname As String
            Dim empLname As String
            Dim empDept As String
            Dim empStat As String
            Dim empYears As String

            empNum = eNumText.Text
            empFname = empFnameText.Text
            empLname = empLnameText.Text
            empDept = DeptText.Text
            empStat = StatText.Text
            empYears = yearstext.Text



            Dim conn As New OleDbConnection(connstring)
            conn.Open()

            Dim DBID As String  ' Or whatever type you're using for the ID field
            Dim DBFirstName As String
            Dim SqlQuerry As String = "SELECT * FROM tbl_empinfo WHERE EmpID like empNum"
            Dim SqlCommand As New OleDbCommand
            Dim SqlAdapter As New OleDbDataAdapter
            Dim Table As New DataTable

         With SqlCommand
            .CommandText = SqlQuerry
            .Connection = conn

        End With

        With SqlAdapter
            .SelectCommand = SqlCommand
            .Fill(Table)


        End With

        For i = 0 To Table.Rows.Count - 1

            DBID = Table.Rows(i)("EmpID")
            DBFirstName = Table.Rows(i)("FirstName")

            MsgBox(DBID)
            MsgBox(DBFirstName)



        Next


        conn.Close()

    End Sub
End Class

1 个答案:

答案 0 :(得分:0)

您需要实际使用连接字符串。

但首先让我们删除你的连接的重复声明。从代码的最顶部(方法之外的那个)移除Dim conn As New OleDbConnection,因为您在方法内部再次声明,所以不需要它。然后,在方法内部更新您的连接初始化为:         Dim conn As New OleDbConnection(connstring)

不仅如此,还需要初始化命令,并将连接字符串和查询字符串传递给它。适配器需要具有对命令的引用,您需要调用

SQLAdapter.fill(Table) 

将数据放入表格中。

请查看如何使用这些对象...只是创建它们的新实例并不会隐式分配每个对象所需的所有配置信息。

一个注意事项是确保您释放实现IDisposable接口的对象以释放非托管资源。仅仅关闭连接是不够的 - 这将导致内存泄漏,不仅仅是SQL对象,还有使用不直接管理的资源的任何东西。 .NET

 SQLCommand.dispose() 
 SQLAdapter.dispose() 
 Table.dispose() 
 conn.dispose() 
 conn.close() 

最后,一旦你使用上面提供的信息和一些谷歌搜索工作,你需要解决SQLInjection问题。现在,您的查询字符串容易被注入,而用户可能会在查询字符串中引用的文本框中键入一些恶意文本,并在未经您许可的情况下操纵您的数据库。要解决这个问题,请查看参数化命令。

我是通过手机发帖的,或者我提供了一整套完整的代码;但与此同时,我不想为你重写整件事。在这个答案中应该有足够的信息来帮助你做一些研究。

此MSDN页面包含有关OleDb数据适配器的信息以及最后的简短示例。它还包括其他OleDb类和一些教程的链接和参考:  http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.aspx

此MSDN页面包含有关SQLDataAdapter的信息,并在最底部包含一个简短示例。虽然是一个不同的类,但其用法基本上与OleDb类相同:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx

虽然不在vb(它在c#中)的用法是相同的,只是略有不同的语法(我现在可以从手机中找到最好的)。同样,这是针对SQLDataAdapter类的,但使用情况基本相同:http://www.codeproject.com/Tips/462730/Five-different-overloads-of-the-DataAdapter-Fill-m