是啥导致了这个 System.Data.SqlClient.SqlException 错误。我的 SqlDataAdapter 的问题
Posted
技术标签:
【中文标题】是啥导致了这个 System.Data.SqlClient.SqlException 错误。我的 SqlDataAdapter 的问题【英文标题】:What is causing this System.Data.SqlClient.SqlException Error. Issue with my SqlDataAdapter是什么导致了这个 System.Data.SqlClient.SqlException 错误。我的 SqlDataAdapter 的问题 【发布时间】:2013-04-20 22:10:32 【问题描述】:我不确定为什么会收到此错误。我的问题的描述在代码下方。我在下面的代码中排除了一些 Select Cases 和字段,以使其尽可能短。
Private Sub SetClassGrid(ByVal ClassCategory As String)
Dim connectionString As String = WebConfigurationManager.ConnectionStrings("theDataBase").ConnectionString
Dim con As New SqlConnection(connectionString)
Dim sqlCommand As StringBuilder = New StringBuilder()
sqlCommand.Append("SELECT Name, City, State FROM Classes$ WHERE (ClassesCategoryID = ")
Select Case ClassCategory
Case "Art"
sqlCommand.Append("1)")
Case "Drama"
sqlCommand.Append("2)")
Case "Aquarium"
sqlCommand.Append("2)")
End Select
Dim cmd As String = sqlCommand.ToString()
Dim da As New SqlDataAdapter(cmd, con)
Dim ds As New DataSet()
Try
con.Open()
da.Fill(ds, "Classes$")
Finally
con.Close()
End Try
GridView1.DataSource = ds.Tables("Classes$")
GridView1.DataBind()
End Sub
对于 Select Case- 当 ClassCategory = "Art" 时它工作正常;但是,当 ClassCategory 等于其他任何值时,我会收到错误消息。
也适用于 Select Case - 如果案例是“Art”并且如果我将 sqlCommand 从 ="1)" 更改为 ="2)" 它会按预期工作。
所以问题是上面的代码只适用于第一个案例。
【问题讨论】:
我收到此异常:System.Data.SqlClient.SqlException:'=' 附近的语法不正确。在 da.Fill(ds, "Classes$") 调试器显示什么?发生错误时sqlCommand
的值是多少?
【参考方案1】:
调试器显示什么?出错时sqlCommand
的值是多少?
为了确保查询仍然有效,为您的select case
添加默认行为:
Select Case ClassCategory
Case "Art"
sqlCommand.Append("1)")
Case "Drama"
sqlCommand.Append("2)")
Case "Aquarium"
sqlCommand.Append("2)")
Case Else
sqlCommand.Append("-1)")
End Select
更好的是,参数化您的查询:
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand command = new SqlCommand("SELECT Name, City, State FROM Classes$ WHERE " +
"ClassesCategoryID = @Id", connection);
// Add the parameters for the SelectCommand.
command.Parameters.Add("@Id", SqlDbType.Int);
adapter.SelectCommand = command;
并将参数填入你的select case
:
Select Case ClassCategory
Case "Art"
command.Parameters["@Id"].Value = 1;
Case "Drama"
command.Parameters["@Id"].Value = 2;
Case "Aquarium"
command.Parameters["@Id"].Value = 2;
Case Else
command.Parameters["@Id"].Value = -1;
End Select
【讨论】:
Linus,ID 用字符串生成器变量 'sqlCommand' 添加到 Select Case 中 但如果ClassCategory
与任何预定义的Case
不匹配,则没有默认行为。
我有 Case Else,我只是在这里排除,因为 ClassCategory 总是执行正确的案例,我只是在某个地方的 sql 有错误。查询在案例“艺术”上正确执行,但没有别的。我为案例“Art”更改了 sqlCommand =“2)”,查询返回了 ClassCategoryID 为 2 的正确数据——即“戏剧”。
您确定要发布原始代码吗?因为我看不到错误。只有一件事:你不需要括号。
谢谢,成功了!如您所见,我将命令用作字符串。这样做的原因是,当我声明 da As New SqlDataAdapter() 时,我将参数“command”和“con”传递给它。这样做有一个错误。然后从你的代码中,我意识到我应该将 con 传递给 command,而不是 da。【参考方案2】:
考虑添加中断; ?尝试一步一步走,在你的代码执行查询之前,尝试复制查询sql并在服务器中手动执行,看起来查询搞砸了
【讨论】:
VB Select Cases 没有中断(我知道)。是的,查询被搞砸了是我的第一个想法。我已经逐行遍历了代码,select命令是应该的,所以我从这里迷路了。 对,我道歉...我正在阅读 VB,但在我的脑海中,这是一个 switch 语句。我建议的最后一件事是检查您的连接字符串! 这是一个连接问题,但不是字符串。我将连接字符串传递给 SqlDataAdapter,而不是我的 SqlCommand。感谢您的回复。以上是关于是啥导致了这个 System.Data.SqlClient.SqlException 错误。我的 SqlDataAdapter 的问题的主要内容,如果未能解决你的问题,请参考以下文章