是啥导致了这个 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致了这个推进错误?

是啥导致了这个dependabot问题?

是啥导致了这个 NullPointerException? [复制]

Python MySQLdb错误 - 是啥导致了这个

是啥导致了这个“jpackage 不存在”错误?

是啥导致了这个 301 重定向? [关闭]