2011-06-22 116 views
2

從我以前的文章中可以看到,我是使用C#創建網站的新手(儘管我對使用Windows Forms應用程序有相當的經驗)。這些權力正在吸引我離開PHP,但我一直在考慮基礎知識的失敗。SQL插入 - 無效的列名稱

無論如何,這是我的問題。我試圖創建一個簡單的入口到SQL數據庫。我知道我與數據庫的連接是好的,因爲我可以整天關閉SELECT查詢,但我在使用Insert時遇到了問題。

繼承人我的代碼:

string filename = "abc123.jpg"; 
SqlConnection link = new SqlConnection(//you dont need to see my data here ;)); 
string sqlcode = "INSERT INTO file_uploads (upload_filename VALUES ("+filename+")"; 
SqlCommand sql = new SqlCommand(sqlcode,link); 
link.open(); 
sql.ExecuteNonQuery(); 

這將導致 「無效的列名abc123.jpg」 從try/catch語句返回。

任何幫助,將不勝感激。 (我希望他們讓我在PHP做這個笑!)

感謝,

Tripbrock

回答

13

你缺少列名後括號和值代表一個字符串,因此必須用在報價:

string sqlcode = "INSERT INTO file_uploads (upload_filename) " + 
       "VALUES ('"+filename+"')"; 

然而,正確的方法是使用參數化查詢:

string filename = "abc123.jpg"; 
SqlConnection link = new SqlConnection(/*you dont need to see my data here ;)*/); 
string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)"; 
SqlCommand sql = new SqlCommand(sqlcode,link); 
sql.Parameters.AddWithValue("@filename", filename); 
link.open(); 
sql.ExecuteNonQuery(); 
+0

+1缺失「)」...現在進行參數設置! – AdaTheDev

+0

缺少''!我需要拍攝。謝謝!另外,再次感謝使用Params的人。 – tripbrock

0

看起來像你缺少一個支架:

string sqlcode = "INSERT INTO file_uploads (upload_filename VALUES ("+filename+")"; 

應該

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')"; 

此外,爲避免您可以使用SqlCommand對象,像這樣的SQL注入攻擊。

using (SQLCommand oSQLCommand = new SQLCommand("INSERT INTO file_uploads (upload_filename) VALUES (@FileName)") 
{ 
oSQLCommand.Parameters.AddWithValue("@FileName", filename); 

oSQLCommand.ExecuteNonQuery(); 
} 
+0

您還缺少字符串值的單引號。 Tsk tsk。 – slugster

+0

@slugster - 已添加! – WraithNath

0

嘗試

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')"; 

你是缺少一個右括號。

+0

而且你缺少字符串值的單引號。 – slugster

+0

好抓 - 編輯。 – mdm

2

您的SQL格式不正確。試試這個:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')"; 

哪裏upload_filename是列的名稱

+0

對於缺少文件名的單引號+1。雖然我認爲最好是將SQL參數化爲 – AdaTheDev

+0

,但我同意你的看法。 –

0

不知道,如果它是一個錯字,但該行應爲:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')";

的通知後)upload_filename

還在文件名周圍添加單引號。

但你可能想使用參數化查詢:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)";

然後使用command.Parameters增加的實際值。

1

真的,你應該參數化查詢中 - 這減少了注入攻擊的風險:

string filename = "abc123.jpg"; 
using(SqlConnection link = new SqlConnection(/*...*/;))) 
{ 
    // sql statement with parameter 
    string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)"; 
    using(SqlCommand sql = new SqlCommand(sqlcode,link)) 
    { 
     // add filename parameter 
     sql.Parameters.AddWithValue("filename", filename); 
     link.open(); 
     sql.ExecuteNonQuery(); 
    } 
} 

還要注意using語句 - 這些確保連接和命令的物品設置的。