2010-12-05 19 views
0

すべてがデータベースの列型に関係していることを確認しましたが、引き続きSQLCeExceptionが発生します。誰もこのコードの何が間違っているのか教えていただけますか?データベースに挿入

private void ANDPaddDriverButton_Click(object sender, EventArgs e) 
{ 
    string first = ANDPfirstNametextBox.Text; 
    string last = ANDPlastNametextBox.Text; 
    string mid = textBox5.Text; 
    string phone = ANDPphonetextBox.Text; 
    string social = ANDPsSNtextBox.Text; 
     // EmployeeType="Employee" 
    string city = ANDPCityTextbox.Text; 
    string state = ANDPStatetextBox.Text; 
    string zip = ANDPzipCodetextbox.Text; 
    string email = ANDPemailtextBox.Text; 
    string address = ANDPaddressTextBox.Text; 
    string user = userName.Text; 

    DBConn.Open(); 
    SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] VALUES (" + 
      first + "," + last + "," + mid + "," + address + "," + phone + "," + social + "," 
       + "Employee" + "," + city + "," + state + "," + zip + "," + email + "," + userName + ")", DBConn); 
    cmd.ExecuteNonQuery(); 
    DBConn.Close(); 
} 
+4

にスペースを使用しないようにしてみてください。 – SLaks

答えて

2

フィールドの文字列/ varcharは、一重引用符で囲む必要があります。

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] VALUES (" + 
    "'" + first + "'," 

のように...

また、他の誰かが既にあなたが大幅にSQLインジェクション攻撃にあなたのコードを公開するつもりだコメントとして

+7

**いいえ。**彼はパラメータを使うべきです。 – SLaks

+3

はい。彼がすべき。しかし、それは問題ではありません。彼はちょうどエラーがどこにあるのか知りたがっています – Lorenzo

+2

私は常に質問に答えることが必ずしも最良の政策ではないと思います。彼に明白なセキュリティホールがあり、その答えがそのホールに対処していない場合、セキュリティホールは永続化し、全員を危険にさらします。 OPが回答を受け取り、次にそれをクレジットカードデータを扱うコードに適用するとどうなるでしょうか?そこに素敵な簡単な攻撃のベクトルがあります! –

0

ロレンソが言ったように、文字列値でなければなりません一重引用符で囲まれていますが、このようにクエリを作成すべきではない理由を説明するthis pageを読んで、パラメータを使用してクエリを実行する方法を示してください。

3

使用するパラメータは、SQLインジェクションを防ぐために、列の名前、あなたは数量に頼って、そしてあなたのテーブルの列の順序と、それはおそらく将来的に変更されますされているので、(私は、カラム名を推測している):

ところで
SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] (First, Last, Mid, Address, Phone, Social, Employee, City, State, Zip, Email, UserName) VALUES (@First, @Last, @Mid, @Address, @Phone, @Social, @Employee, @City, @State, @Zip, @Email, @UserName)", DBConn); 
cmd.Parameters.AddWithValue("@First", first); 
cmd.Parameters.AddWithValue("@Last", last); 
cmd.Parameters.AddWithValue("@Mid", mid); 
cmd.Parameters.AddWithValue("@Address", address); 
cmd.Parameters.AddWithValue("@Phone", phone); 
// etc. each column 

は、それがSQLインジェクション穴、と貧しいテーブル名を持っているテーブルと列の名前;-)

関連する問題