查询SQL数据库并将结果存储在变量VB.Net中

查询SQL数据库并将结果存储在变量VB.Net中,sql,vb.net,Sql,Vb.net,我正在尝试使用文本框字段查询SQL数据库,并从数据库中检索一列并将其存储在变量中,这样我就可以在我站点的其他位置使用它。我的web表单要求用户输入一些项目,例如名称和邮政编码 Public sub getdata() Dim strEmailAddress As String = Nothing Dim dt As New DataTable Dim da As New dbConn da.strSQL = " select top 1 [email add

我正在尝试使用文本框字段查询SQL数据库,并从数据库中检索一列并将其存储在变量中,这样我就可以在我站点的其他位置使用它。我的web表单要求用户输入一些项目,例如名称和邮政编码

Public sub getdata() 

    Dim strEmailAddress As String = Nothing

    Dim dt As New DataTable
    Dim da As New dbConn
    da.strSQL = " select top 1 [email address] from [zipcode] " _
            & " where [zip code] = '" & strZipCode & "'" _
            & " order by [email address] asc"
    dt = da.getDt
    If dt.Rows.Count > 0 Then
        If Not IsDBNull(dt.Rows(0)(0).ToString) Then
            strEmailAddress = dt.Rows(0)(0).ToString
        End If
    End If
End Sub 
我的数据库有3列;电子邮件地址、邮政编码和id。我需要输入表单来查询数据库并返回与用户输入的“邮政编码”匹配的“电子邮件地址”

我理解SQL SELECT语句,并且连接字符串是正确的。我的查询正在运行,我似乎不知道如何将返回的“电子邮件地址”存储在变量中。任何帮助都将不胜感激

Dim strconnection As String, strSQL As String, strZipCheck As String
    Dim objconnection As OleDbConnection = Nothing
    Dim objcmd As OleDbCommand = Nothing
    Dim RREmail As String = Nothing
    Dim zipQuery As String = zipCodeBox.Text
    'connection string
    strconnection = "provider=SQLOLEDB;Data Source=XXX.XXX.XXX.XXX;Initial Catalog=XXXXXXX;User ID=XXXX;Password=XXXXXXXX;"

    objconnection = New OleDbConnection(strconnection)
    objconnection.ConnectionString = strconnection


    'opens connection to database
    objconnection.Open()
    strSQL = "SELECT [EMAIL ADDRESS] FROM ZIPCODEDATA WHERE [ZIP CODE] = @ZIP CODE "
    objcmd = New OleDbCommand(strSQL, objconnection)

    RREmail = CType(objcmd.ExecuteScalar(), String)
    lblRREmail.Text = RREmail
    objconnection.Close()

虽然其他评论确实指出了您的语法的特殊缺陷,但我想进一步讨论存储变量的问题。除非调用存储过程并需要输出参数,否则通常不使用参数化连接。相反,这里是我经常做的创建数据库连接并获得结果的步骤

首先,我创建了一个名为dbConn的公共类,这样我就不必写一百万遍了

Imports System.Data.SqlClient
Public Class dbConn
    Public Property strSQL As String
    Private objConn As SqlClient.SqlConnection = _
            New SqlClient.SqlConnection("Data Source=(local)\dev;Initial Catalog=testDataBase;Persist Security Info=False;Integrated Security = true;")
    Public Function getDt() As DataTable
        Dim Conn As New SqlClient.SqlConnection
        Dim da As SqlClient.SqlDataAdapter
        Dim dt As New DataTable
        Try
            objConn.Open()
            da = New SqlClient.SqlDataAdapter(strSQL, objConn)
            da.Fill(dt)
            da = Nothing
            objConn.Close()
            objConn = Nothing
        Catch ex As Exception
            objConn.Close()
            objConn = Nothing
        End Try
        Return dt
    End Function
End Class
然后从另一个类(假设它的形式为1)调用该函数以获取返回给我的datatable。在这种情况下,我选择Top1来保存您的理智,以防每个邮政编码有多个电子邮件地址

Public sub getdata() 

    Dim strEmailAddress As String = Nothing

    Dim dt As New DataTable
    Dim da As New dbConn
    da.strSQL = " select top 1 [email address] from [zipcode] " _
            & " where [zip code] = '" & strZipCode & "'" _
            & " order by [email address] asc"
    dt = da.getDt
    If dt.Rows.Count > 0 Then
        If Not IsDBNull(dt.Rows(0)(0).ToString) Then
            strEmailAddress = dt.Rows(0)(0).ToString
        End If
    End If
End Sub 
从那里,您可以在设置strEmailAddress后在sub内使用它,或者您可以将字符串声明作为公共字符串声明移动到sub之外的其他位置使用它,或者您可以创建其他类,例如带有strEmailAddress的公共属性的email类,以便将其传递给其他人,等等


我希望里面有些东西能帮助你理解如何处理你的问题

您在哪里指定邮政编码参数?正如Goose所暗示的,您必须调用
objcmd.Parameters.AddWithValue(“@zip”,zipQuery)
或类似的方法来设置邮政编码参数。这样看来,您的代码已经实现了您想要的功能。请注意,如果用户输入的邮政编码无效怎么办?该查询仍将检索NULL,您不允许这样做。此外,如果您希望@zip_code作为您的参数名,则参数名中不能有空格。另外,请注意,我建议在创建表时避免在列名中使用空格,因为它更容易处理。我知道这是一年前发布的,但我还想指出,任何清理代码(如
objConn.Close
)都应该放在
Finally
块中。如果在关闭SQL连接的行之前抛出异常,它将不会关闭它。最后将它放入
将允许它运行关闭行,即使抛出异常也是如此。