2010-12-21 82 views
0

每當我呼籲以下CommandText的「ExecuteNonQuery」命令,我得到上面的SQLException的SQLException:不正確的語法附近「2」

myCommand.CommandText = "INSERT INTO fixtures (round_id, matchcode, date_utc, time_utc, date_london, time_london, team_A_id, team_A, team_A_country, team_B_id, team_B, team_B_country, status, gameweek, winner, fs_A, fs_B, hts_A, hts_B, ets_A, ets_B, ps_A, ps_B, last_updated) VALUES (" _ 
      & round_id & "," & match_id & "," & date_utc & ",'" & time_utc & "'," & date_london & ",'" & time_london & "'," & team_A_id & ",'" & team_A_name & "','" & team_A_country & "'," & team_B_id & ",'" & team_B_name & "','" & _ 
      team_B_country & "','" & status & "'," & gameweek & ",'" & winner & "'," & fs_A & "," & fs_B & "," & hts_A & "," & hts_B & "," & ets_A & "," & ets_B & "," & ps_A & "," & ps_B & "," & last_updated & ")" 

但每當我刪除最後一個表項 - 「LAST_UPDATED」錯誤消失。請幫我解決這個問題。有沒有對datetime字段給予特殊待遇?

感謝您的幫助

+3

爲什麼啊,爲什麼人們仍然沒有使用參數化查詢。你讓你的生活變得非常困難,更不要說打開自己的SQL注入攻擊。 – RPM1984 2010-12-21 02:32:04

+1

請向我們展示所有文本串聯的結果。答案可能很明顯。 – 2010-12-21 02:47:14

+0

我知道有關SQL注入攻擊以及什麼時候暴露給他們。非條目不是來自表單上的文本框,它們全部來自訂閱的足球比賽的XML提要。所以沒有注射風險。無論如何,我已經使用存儲過程,它的工作。 – 2010-12-22 06:52:42

回答

0

您需要使用參數。

+0

沒錯。我用一個存儲過程作爲參數,而不是代碼中的SQL查詢,它的工作原理像魔術一樣。 – 2010-12-22 06:45:29

3

如果您在調試器中查看myCommand.CommandText的值,並將字符串連接起來後,我認爲很容易發現問題。我的猜測是,你可能需要在你的日期時間價值報價:

... & ",'" & last_updated & "')" 

您可能還需要指定用於日期時間轉換爲字符串格式,例如last_updated.ToString("yyyy-MM-dd HH:mm:ss")

但是,如評論中指出的那樣,使用參數化查詢會更好。然後事情就會起作用。

0

幾乎可以肯定,last_updated中包含的值必須在生成的INSERT語句中分隔(異常中的「2」可能等於2010等)。

請不要發表您使用的表達式來計算INSERT語句,而是生成的語句本身(CommandText的內容)。這是錯誤的地方。

1

我在網上看到很多關於類似問題的帖子。我嘗試使用存儲過程,它像魔術一樣工作。爲了所有可能共享類似命運的人的利益,請嘗試存儲過程。這是我的新代碼。

Dim myConnection As New SqlConnection(strConnection) 
    Dim myCommand As New SqlCommand("TCreateMatch", myConnection) 

    With myCommand 
     .CommandType = CommandType.StoredProcedure 
     With .Parameters 
      .AddWithValue("@round_id", round_id) 
      .AddWithValue("@matchcode", match_id) 
      .AddWithValue("@date_utc", date_utc) 
      .AddWithValue("@time_utc", time_utc) 
      .AddWithValue("@date_london", date_london) 
      .AddWithValue("@time_london", time_london) 
      .AddWithValue("@team_A_id", team_A_id) 
      .AddWithValue("@team_A", team_A_name) 
      .AddWithValue("@team_A_country", team_A_country) 
      .AddWithValue("@team_B_id", team_B_id) 
      .AddWithValue("@team_B", team_B_name) 
      .AddWithValue("@team_B_country", team_B_country) 
      .AddWithValue("@status", status) 
      .AddWithValue("@gameweek", gameweek) 
      .AddWithValue("@winner", winner) 
      .AddWithValue("@fs_A", fs_A) 
      .AddWithValue("@fs_B", fs_B) 
      .AddWithValue("@hts_A", hts_A) 
      .AddWithValue("@hts_B", hts_B) 
      .AddWithValue("@ets_A", ets_A) 
      .AddWithValue("@ets_B", ets_B) 
      .AddWithValue("@ps_A", ps_A) 
      .AddWithValue("@ps_B", ps_B) 
      .AddWithValue("@last_updated", last_updated) 
     End With 

     Try 
      myConnection.Open() 
      result = .ExecuteNonQuery() 
     Catch ex As Exception 

     Finally 
      myConnection.Close() 
     End Try 
    End With 

感謝所有

+0

您也可以只使用正常查詢的參數。 – SLaks 2010-12-22 13:53:12