将变量插入查询字符串 - 它将无法正常工作!

时间:2010-04-22 11:54:12

标签: sql vb.net query-string

基本上我有一个查询字符串,当我在目录中硬编码时它很好。当我尝试通过变量添加它时它就不会捡起它。

这有效:

  Dim WaspConnection As New SqlConnection("Data Source=JURA;Initial Catalog=WaspTrackAsset_NROI;User id=" & ConfigurationManager.AppSettings("WASPDBUserName") & ";Password='" & ConfigurationManager.AppSettings("WASPDBPassword").ToString & "';")

这不是:

Public Sub GetWASPAcr()

    connection.Open()

    Dim dt As New DataTable()
    Dim username As String = HttpContext.Current.User.Identity.Name
    Dim sqlCmd As New SqlCommand("SELECT WASPDatabase FROM dbo.aspnet_Users WHERE UserName = '" & username & "'", connection)

    Dim sqlDa As New SqlDataAdapter(sqlCmd)

    sqlDa.Fill(dt)

    If dt.Rows.Count > 0 Then

        For i As Integer = 0 To dt.Rows.Count - 1
            If dt.Rows(i)("WASPDatabase") Is DBNull.Value Then
                WASP = ""
            Else
                WASP = "WaspTrackAsset_" + dt.Rows(i)("WASPDatabase")
            End If

        Next

    End If
    connection.Close()

End Sub

Dim WaspConnection As New SqlConnection("Data Source=JURA;Initial Catalog=" & WASP & ";User id=" & ConfigurationManager.AppSettings("WASPDBUserName") & ";Password='" & ConfigurationManager.AppSettings("WASPDBPassword").ToString & "';")

当我调试目录在查询字符串中为空时,但WASP变量保存值“WaspTrackAsset_NROI”

任何想法都是为什么?

干杯,

jonesy

alt text http://www.freeimagehosting.net/uploads/ba8edc26a1.png

6 个答案:

答案 0 :(得分:4)

我可以看到一些问题。

  1. 您正在SQL语句中使用连接。这是一种不好的做法。改为使用参数化查询。
  2. 您使用单引号包围密码。它们不是必需的,事实上,我很惊讶,即使密码本身没有单引号也能正常工作。
  3. 您应该使用Using block
  4. 包含实现IDisposable的类
  5. 您应该在GetWASPcr中重新创建WASP连接对象,如下所示:
  6. Public Sub GetWASPAcr()
        Dim username As String = HttpContext.Current.User.Identity.Name
        Dim listOfDatabaseConnectionString As String = "..."
    
        Using listOfDatabaseConnection As SqlConnection( listOfDatabaseConnectionString )
            Using cmd As New SqlCommand("SELECT WASPDatabase FROM dbo.aspnet_Users WHERE UserName = @Username")
                cmd.Parameters.AddWithValue( "@Username", username )
    
                Dim dt As New DataTable()
                Using da As New SqlDataAdapter( cmd )
                    da.Fill( dt )
    
                    If dt.Rows.Count = 0 Then
                        WaspConnection = Null
                    Else
                        Dim connString As String = String.Format("Data Source=JURA;Initial Catalog={0};User Id={1};Password={2};" _ 
                            , dt.Rows(0)("WASPDatabase") _ 
                            , ConfigurationManager.AppSettings("WASPDBUserName") _ 
                            , ConfigurationManager.AppSettings("WASPDBPassword"))
    
                        WaspConnection = New SqlConnection(connString);
                    End If  
                End Using
            End Using
        End Using
    End Sub
    

    在此示例中,listOfDatabaseConnectionString是中央数据库的初始连接字符串,可在其中找到应用于后续连接的目录名称。

    所有这一切,为什么你需要一个类级变量来保持连接?您应该使所有数据库调用打开连接,执行sql语句,关闭连接。因此,五次数据库调用将打开和关闭连接五次。这听起来很昂贵,除了.NET为您提供连接池,因此当您完成连接而另一个请求打开时,它会将其从池中拉出来。

答案 1 :(得分:1)

在实例化类时,将评估传递给此SqlConnection对象的构造函数的字符串。在您调用的方法被调用之前,您的WASP变量(我假设)将不会被设置。

答案 2 :(得分:0)

可能想要找一个找到你的数据库:

For i As Integer = 0 To dt.Rows.Count - 1
            If dt.Rows(i)("WASPDatabase") Is DBNull.Value Then
                WASP = ""
            Else
                WASP = "WaspTrackAsset_" + dt.Rows(i)("WASPDatabase")
                break
            End If

        Next

答案 3 :(得分:0)

[link text] [1]您正在通过将字符串的值添加到字符串中来动态构建字符串。因此,对于列“WASPDatabase”的相关行已添加到您的字符串中。所以你得到了它的东西。另一方面,您之前的“select ... from ... where ...”查询,您手动汇总变量的字符串会使您对SQL注入攻击开放。

尽管此链接[1]:how to update a table using oledb parameters?“使用参数化的示例查询”是使用参数化值查询的C#示例,但类似的原则适用于大多数所有SQL数据库。

答案 4 :(得分:0)

在您创建新连接时,WASP会保留您希望它持有的值吗?它是字符串数据类型?尝试在WASP之后添加.ToString,看看是否有帮助。

有趣的问题。 = - )

答案 5 :(得分:0)

问题是,正如Paddy已经指出的那样,在您甚至有机会调用GetWASPAcr之前,WaspConnection对象已初始化。试试这个:

Public Sub GetWASPAcr()
   '[...]

End Sub

Dim _waspConnection As SqlConnection
Public Readonly Property WaspConnection As SqlConnection
  Get
    If _waspConnection Is Nothing Then
      GetWASPAcr()
      _waspConnection = New SqlConnection("Data Source=JURA;Initial Catalog=" & WASP & ";User id=" & ConfigurationManager.AppSettings("WASPDBUserName") & ";Password='" & ConfigurationManager.AppSettings("WASPDBPassword").ToString & "';")
    End If
    Return _waspConnection
  End Get
End Property