基本上我有一个查询字符串,当我在目录中硬编码时它很好。当我尝试通过变量添加它时它就不会捡起它。
这有效:
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
答案 0 :(得分:4)
我可以看到一些问题。
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