2012-04-19 63 views
2
public void RegisterUser(string passw,string uname ,string fname ,string lname, string email) 
{ 
    string strSql = @"INSERT INTO User (passw,uname,fname,lname,email) values ('" + passw + "','" + uname + "','" + fname + "','" + lname + "','" + email + "')";               
    cn.Open(); 
    OleDbCommand cmd = new OleDbCommand(strSql,cn); 
    int yy= cmd.ExecuteNonQuery(); 
    cn.Close(); 
    cn.Dispose(); 

} 

语法错误,无论我做什么,我得到了同样的错误 没有人在这里看到什么了吗? 或有另一种创造性的方法来解决这个问题 谢谢System.Data.OleDb.OleDbException:INSERT INTO语句中

+4

使用参数化命令,它更安全http://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.80).aspx – Fabio 2012-04-19 22:33:26

+0

您可以设置断点并打印查询字符串的内容? – 2012-04-19 22:34:52

+3

O'Malley的姓是? – 2012-04-19 22:47:18

回答

6

你的代码可以动态改变,取决于用户输入。这就是导致错误的原因。

让我来解释一下,如果你的任何一个输入字段包含一个apostroph ['] sql中断并且现在有一个未封闭的引用。

不仅它也暴露您的代码SQL注入攻击

所以我建议你使用参数传递值作为参数被视为不同的,是安全的,以及防止SQL注入。

public void RegisterUser(string passw,string uname ,string fname ,string lname, string email) 
{ 
    string strSql = @"INSERT INTO User (passw,uname,fname,lname,email) values  (@passw,@uname,@fname,@lname,@email)";               
    cn.Open(); 
    OleDbCommand cmd = new OleDbCommand(strSql,cn); 
    cmd.Parameters.AddWithValue("@passw",passw); 
    cmd.Parameters.AddWithValue("@uname",uname); 
    cmd.Parameters.AddWithValue("@fname",fname); 
    cmd.Parameters.AddWithValue("@lname",lname); 
    cmd.Parameters.AddWithValue("@email",email); 
    int yy= cmd.ExecuteNonQuery(); 
    cn.Close(); 
    cn.Dispose(); 
} 
+0

不客气。只是为了通知你,如果真的有帮助,那么你可以通过在答案左侧打勾(右)符号来接受答案。 – Deb 2012-04-20 14:00:54

0

在Oracle,user是一个保留字和INSERT INTO User ...生成ORA-00903: invalid table name