2013-04-10 48 views
-2

此刻我試圖用3個值填充我的SQL Server數據庫,我通過C#程序編寫了硬編碼。SqlCommand錯誤

我的數據庫有4列,內容如下:

  • RowID(這應該讓自動我的數據庫更新)
  • Name(存儲爲一個字符串)
  • Score(INT)
  • Accuracy(float)

在我的代碼中,米試圖與下面的代碼行來填補這些了:

using (SqlConnection connection = new SqlConnection(DBConnection)) 
{ 
      string name = "John"; 
      int score = 123; 
      float Accuracy = 20.0f; 

      SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(" + name + " , " + score + " , " + Accuracy + ")", connection); 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 

但是當我運行我的程序時,Visual Studio突出

command.ExecuteNonQuery() 

說明「約翰」不是一個有效的列。

有什麼我做錯了嗎?

+3

你應該已經閱讀了一件事,你已經花了10秒鐘搜索StackOverflow的任何相關問題是:**使用參數化查詢,爲了SANITY的SAKE !!! ** – 2013-04-10 09:22:09

+0

是否適合你? – 2013-04-10 10:21:48

回答

0

由於John是一個字符串,你必須讓你的數據庫知道,通過在John的兩邊添加'。

因此改變...VALUES(" + name + " , "......VALUES('" + name + "' , "...

如果你只寫約翰沒有「任何一方,則數據庫會認爲你是referrign一列,併爲您的錯誤消息顯示:數據庫不知道任何有關一列名爲John

+1

請不要鼓勵使用連接的SQL命令... – 2013-04-10 09:22:58

+0

@ThorstenDittmar - 我只是指出他的代碼出了什麼問題(從SQL服務器的角度來看)。我從不鼓勵將連接字符串發送到數據庫,但我想我可以在我的答案中指出它;) – 2013-04-10 09:28:40

0

只是做thisto工作得當

SqlCommand command = new SqlCommand("INSERT INTO 
     HighScoreTable(Name, Score, Accuracy) 
       VALUES('" + name + "' , " + score + " , " + Accuracy + ")", connection); 

的名稱是字符串值只是'裝飾它這樣'" + name + "'因爲在SQL Server中,如果串與'裝飾,它會給你一個錯誤

現在字符串值獲得轉換爲下面的SQL查詢shich無效

 INSERT INTO 
     HighScoreTable(Name, Score, Accuracy) 
       VALUES(John , 123 , 20.0f) 

爲了避免這個錯誤使用SQLParameter,即參數化查詢

1

大量錯在這裏。

  1. 如果你想插入這樣你需要添加「'」約 你的價值觀。
  2. 你需要逗號之間的值。
  3. SQL注入的時機已經成熟
  4. 由於每個查詢都不同,因此性能不佳。

你真的想被添加參數(AddParameterWithValue)

在這裏看到:

SQL injection on INSERT

+0

1)不完全正確。如果值是字符串,則需要將值包含在單引號中。數字可以使用沒有單引號。 – 2013-04-10 09:25:52

+0

是的同意。這裏的主要問題是沒有使用參數,所以這是一個有爭議的問題。 – LoztInSpace 2013-04-10 09:28:47

0

首先,我強烈建議你採用不同的方法 - 參數化查詢,儘快。它會阻止SQL注入並讓你的生活更輕鬆,因爲你不必每次都考慮格式化你的SQL查詢。一段時間後它會變得非常乏味,想知道所有的引用應該去哪裏,這是一個痛苦的屁股在維護修改這樣的代碼......

其次,你的SQL翻譯成這個樣子的:

SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(John , 10 , ..)", connection); 

SQL認爲你的價值實際上是列名!你需要用單引號

INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES('John' , 10 , '..') 
+1

但是'Score'是一個'INT'--所以你提供給分數的值確實不應該用引號引起來...... – 2013-04-10 09:31:39

+0

@marc_s,true,fixed :) – walther 2013-04-10 09:35:54

1

的(在我看來只)正確做到這樣你的價值觀是:

using (SqlConnection connection = new SqlConnection(DBConnection)) 
{ 
    string name = "John"; 
    int score = 123; 
    float Accuracy = 20.0f; 

    using (SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(@name, @score, @accuracy)", connection); 
    { 
     command.Parameters.AddWithValue("@name", name); 
     command.Parameters.AddWithValue("@score", score); 
     command.Parameters.AddWithValue("@accuracy", accuracy); 

     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

請注意,您不需要記使用參數化查詢時的單引號!字符串參數不包含在單引號中 - 這些都是由框架完成的。

1

使用參數化對於這類問題的查詢:

using (SqlConnection connection = new SqlConnection(DBConnection)) 
     { 
      string name = "John"; 
      int score = 123; 
      float Accuracy = 20.0f; 

      SqlCommand command = new SqlCommand("INSERT INTO HighScoreTable(Name, Score, Accuracy) VALUES(@name,@score,@accuracy)", connection); 

       SqlParameter name= new SqlParameter("@name", name); 
       name.Value = name; 
       command.Parameters.Add(name); 
       . 
       . 
       . 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 

這樣這樣可避免列的是混亂,你可以添加參數。

+0

你寫它的方式相當多餘。你可以使用'AddWithValue'。另外,你正在使用的'SqlParameter'構造函數已經設置了參數的值,所以不需要'name.Value = ...'這一行。 – 2013-04-10 09:28:46

+1

@ThorstenDittmar是的,最近我開始寫參數化查詢,在此之前,我使用寫海報的寫法相同的查詢。我看到了你的答案,這對我來說已經不再適用了。感謝名單。 – Freelancer 2013-04-10 09:31:11

+0

不要誤解我的意思,你的回答仍然正確:-) – 2013-04-10 09:34:34