插入数据库

问题描述:

我已经确定一切都与数据库中的列类型有关,但我不断收到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

它有一个SQL注入孔,一个贫穷的表名。 – SLaks 2010-12-05 23:28:50

您的string/varchar类型的字段应用单引号引起来!

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

等等...

而且,别人已经评论你要你的代码极大地暴露于SQL注入攻击

+7

**否**他应该使用参数。 – SLaks 2010-12-05 23:30:18

由于洛伦佐表示,该字符串值必须是用单引号括起来,但是请阅读this page这就解释了为什么你不应该用这种方式建立一个查询,并告诉你如何用参数来完成。

使用参数来防止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 

顺便说尽量不要使用表空间和列名;-)