2013-04-20 52 views
0

我不知道为什么我得到这个错误。我的问题的描述在代码下面。我已经排除了下面代码中的一些Select个案和字段,以尽可能缩短它。什么导致此System.Data.SqlClient.SqlException错误。问题与我的SqlDataAdapter

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 

对于选择案例 - 当ClassCategory = “艺术”,它工作正常;然而当类别等于其他任何东西,我得到一个错误。

同样对于选择案例 - 如果情况是“艺术”和,如果我改变从的SqlCommand =“1)”为=“2)”,它按预期工作。

所以问题是,上述代码只适用于第一个案例。 enter image description here

![在这里输入的形象描述] [2]

+0

什么是错误? – 2013-04-20 22:12:33

+0

我得到这个异常:System.Data.SqlClient.SqlException:'='附近的语法不正确。在da.Fill(ds,“Classes $”) – KRob 2013-04-20 22:37:33

+0

调试器显示什么?错误发生时'sqlCommand'的价值是什么? – 2013-04-20 22:38:48

回答

3

什么调试器显示?发生错误时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 
+0

Linus,在Select Case中添加了ID与字符串生成器变量'sqlCommand' – KRob 2013-04-20 22:19:43

+1

但是,如果'ClassCategory'不匹配任何预定义的'Case',则没有默认行为。 – 2013-04-20 22:22:33

+0

我有案例否则,我只是排除在这里,因为ClassCategory总是执行正确的大小写,我只是有一个SQL的错误。该查询正确执行案例“艺术”,但没有别的。我为案例“Art”更改了sqlCommand =“2)”,并且查询返回了ClassCategoryID为2的正确数据,即“Drama”。 – KRob 2013-04-20 22:29:17

0

考虑加入break; ?尝试去一步一步,并且在代码执行查询之前,尝试复制查询sql并手动在服务器中执行它,它看起来像查询被搞砸了

+0

VB选择案件没有休息(我知道)。是的,查询被搞砸是我的第一个想法。我一行一行地通过代码,select命令是应该的,所以我从这里输了。 – KRob 2013-04-20 22:36:05

+1

对,我appologize ...我在读VB,但在我的脑海里,这是一个switch语句。我最后一件事是检查你的连接字符串! – joe 2013-04-20 22:43:26

+0

这是一个连接问题,但不是字符串。我传递连接字符串到SqlDataAdapter,反对我的SqlCommand。谢谢你的回复。 – KRob 2013-04-20 23:00:35

相关问题