好吧,基本上我今天早些时候就问过这个问题,但我们没有找到问题的根源,很多猜测都让解决方案蒙上阴影。我有一个程序,目前需要检查来自RegUserName.Text
的用户输入'Gamer-Tag',并将其与存储在PersonsA
数据库中的SQL表Members_Details
上的Gamer-Tags进行比较
当代码运行时,我收到以下错误;
发生了'System.ArgumentException'类型的未处理异常 System.Data.dll中
附加信息:列'Gamer_Tag'不属于表格 PersonsA。
然而,Gamer-Tag IS在表中;这是表格中的第二列。服务器是MS SQL Server,当我使用'SQL Server Management Studio'时,我可以清楚地看到表和&列。从那里开始,与Gamer_Tag
列相关的所有SQL代码都可以完美地工作,所以它肯定在数据库中。
这是按下按钮时调用的代码。此代码使用错误“调用”函数。
Dim dbManager As New DatabaseManager() 'My Class Where The Functions Are
If dbManager.CheckGamerTagisMember(RegUserName.Text) Then
MsgBox("Gamer-Tag is NOT A Member.")
GoTo Ender
Else
MsgBox("Gamer-Tag is A Member.")
GoTo Ender
End If
这是包含错误的函数;
Public Function CheckGamerTagisMember(ByVal gamertag As String) As Boolean
Connection = New SqlConnection("Data Source =" & My.Settings.ServerIP & ";Initial Catalog=Members_Details;Integrated Security=False;User=" & My.Settings.UserName & ";Password=*******;")
Connection.Open()
Dim gamertagDatSet As New DataSet()
usersDataAdapter.FillSchema(gamertagDatSet, SchemaType.Source, "PersonsA")
usersDataAdapter.Fill(gamertagDatSet, "PersonsA")
Dim table As DataTable = gamertagDatSet.Tables("PersonsA")
For i As Integer = 0 To table.Rows.Count - 1
Dim storedgamertag As String = table.Rows(i)("Gamer_Tag").ToString.ToString '<-------- ERROR
If (storedgamertag = gamertag) Then
gamertagDatSet.Dispose()
Connection.Close()
Return True
End If
Next
gamertagDatSet.Dispose()
Connection.Close()
Return False
End Function
什么可能导致这个问题?我已经检查了明显的拼写和间距,防火墙已关闭,而Column在那里毫无疑问。功能代码改编自我的SQL登录功能,它没有任何问题,所以我很困惑为什么这不起作用。
以下是MS SQL Server Management Studio的屏幕截图,其中显示了PersonsA
表列。
现在真的很令人沮丧。
答案 0 :(得分:1)
一些可能的原因:
您的用户实际上已被拒绝查看该列。这可以通过以下简单的方式实现:
DENY SELECT ON dbo.PersonsA(Gamer_Tag) TO your_user;
有多个PersonsA
表,您在代码中访问的表实际上与dbo
不同。这就是为什么在创建或引用对象时始终始终始终指定模式的原因。总是。 Read this post for more info
您的代码连接到不同的服务器,不同的数据库或与Management Studio相同的数据库的不同副本。 (后者可能在使用SQL Express和User Instance/AttachDbFileName
设置时发生,我可以看到您的代码未使用,但我不知道您是否从Management Studio连接到用户实例。)