2011-06-22 17 views
2

私の以前の投稿から見た人の中には、C#を使用してWebサイトを作成するのが初めての人もいます(Windows Formsアプリケーションではかなり使い慣れていますが)。 PHPから私を奪う力は私を魅了していますが、私は基本的なことを考えています。SQL INSERT - 無効な列名

とにかく、これは私の問題です。私はSQLデータベースに簡単なエントリを作成しようとしています。私は一日中SELECTクエリを取り除くことができるので、DBへの私の接続がうまくいっていることを知っていますが、私はInsertを使うことに問題があります。

HERESに私のコード:

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(); 

これはのtry/catchから返される "無効な列名abc123.jpg" になります。

ご協力いただければ幸いです。

おかげで、

Tripbrock

答えて

13

あなたは、列名の後に括弧が欠落している(私は!彼らは私が笑PHPでこれをやらせることを望む)と値は文字列を表し、などが同封されなければなりません引用符で:

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+")"; 

は、あなたがそうのようなSqlCommandオブジェクトのオブジェクトを使用することができ、SQLインジェクション攻撃を避けるために、また

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

であるべき。

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

oSQLCommand.ExecuteNonQuery(); 
} 
+0

また、文字列値の前後に一重引用符がありません。 Tsksksk。 – slugster

+0

@slugster - added! – 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文に注意してください - これらは、接続とコマンドオブジェクトが処分されることを確認してください。