2011-02-14 91 views
0

我可以知道我的声明有什么问题吗?我收到一个语法错误。一直试图找出什么是错的。 :(动态创建的SQL插入语句出错

cmd.CommandText = "INSERT INTO LogIn(Username,Password) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')"; 

回答

3
cmd.CommandText = "INSERT INTO LogIn([Username],[Password]) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')"; 

如果错误是由于保留关键字: - 用户名和密码造成的,则此代码将有所帮助。如果不是这样,请引用错误。

0

是ID列一个整数吗?如果不是你需要用值单引号了。 此外,尝试删除括号。

0

最有可能的,在IDTextBox.text值不是数字...

但像丹尼尔指出,这是对SQL注入很容易..

如果我输入会发生什么:

' ; DROP TABLE login 

在EditUserNameTextBox字段中

+2

它会失败。访问将不会运行多个声明,但我qu :) :) – Fionnuala 2011-02-13 22:16:31

+0

THanks Remou,我不知道。只是想举一个SQL注入有多危险的例子 – Sparky 2011-02-13 22:44:11

+1

对于Jet/ACE,这不是很危险,因为没有DDL或DML语句可以通过WHERE子句注入。但是,可以更改行为的行数,这在使用SQL UPDATE的情况下可能很危险。有关Access的更多具体信息,请参阅http://stackoverflow.com/questions/512174/non-web-sql-injection/522382#522382。 – 2011-02-14 02:15:42

0

检查是否有效。你在WHERE语句中缺少值单引号:

"UPDATE 
    LogIn 
SET 
    Username = '" + EditUsernameTextBox.Text + "' 
    ,Password = '" + EditPasswordTextBox.Text + "' 
WHERE 
    (ID = '" + IDTextBox.Text + "')"; 

另外,要确保,丹尼尔·怀特所说,你采取任何SQL注入的照顾。

+0

仍然收到语法错误:/可能是因为我的ID数据类型是自动编号? – pacheco 2011-02-13 22:13:55

0

你错过了一对单引号的,如果你的ID为非数字:

WHERE (ID ='" + IDTextBox.Text + "')"; 
0

做的EditUsernameTextBox.TextEditPasswordTextBox.Text本身有引号值是多少?这将会使SQL发生混乱。

如果是这样,你需要逃避它们。或者不要使用已经指出的字符串连接...

并且您是否打印了该语句以查看所请求的外观?

1

最好的方法是使用参数:'@' 通过这个,你的代码将看起来更清晰和易于理解。并使您的应用程序更安全。

试试这个代码:

  using (var con = new OleDbConnection(_constring)) 
      { 
       con.Open(); 
       using (
        var cmd = 
         new OleDbCommand(
"UPDATE LogIn SET [email protected], [email protected] WHERE (ID = @Id)", 
          con)) 
       { 
        try 
        { 

         cmd.Parameters.AddWithValue("@Username",EditUsernameTextBox.Text); 
         cmd.Parameters.AddWithValue("@Password",EditPasswordTextBox.Text); 
         cmd.Parameters.AddWithValue("@Id",IDTextBox.Text); 


         cmd.ExecuteNonQuery(); 
        } 
        catch (Exception ex) 
        { 
         throw; 
        } 
        finally 
        { 
         con.Close(); 
        } 

       } 

商祺!

1

请保护单引号。另外,您可能需要Access SQL字符串中的结尾分号。

cmd.CommandText = “INSERT INTO登录(用户名,密码)VALUES( '” + AddUsernameTextBox.Text.Replace( “'”, “'”)+ “ ''” + AddPasswordTextBox.Text。替换(“'”,“''”)+“');”;

当然,使用参数化查询当然只有100%更好;从你的其他问题是这个C#/ Visual Studio通过OLE/Jet对MS Access?

2
command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)"; 

    //Not sure how you create your commands in your project 
    //here I'm using the ProviderFactory to create instances of provider specific DbCommands. 

    var parameter = dbProviderFactory.CreateParameter(); 
    parameter.DbType = System.Data.DbType.String; 
    parameter.ParameterName = "@Username"; 
    parameter.Value = AddUsernameTextBox.Text; 
    command.Parameters.Add(parameter); 

    parameter = dbProviderFactory.CreateParameter(); 
    parameter.DbType = System.Data.DbType.String; 
    parameter.ParameterName = "@Password"; 
    parameter.Value = AddPasswordTextBox.Text; 
    command.Parameters.Add(parameter); 

下面是一个使用ConnectionStringSettings和DbProviderFactory等,这是不会解决你的问题更完整的代码示例,但这是如果你使用ADO.NET的核心,你做的数据访问方式似乎在你的样本中做。

ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings["SomeConnectionName"]; 
    if (connectionStringSettings == null) 
    throw new Exception("Application config file does not contain a connectionStrings section with a connection called \"SomeConnectionName\""); 
    DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName); 
    using (var dbConnection = dbProviderFactory.CreateConnection()) 
    { 
    dbConnection.ConnectionString = connectionStringSettings.ConnectionString; 
    dbConnection.Open(); 
    using (var command = dbConnection.CreateCommand()) 
    { 
     command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)"; 

     var parameter = dbProviderFactory.CreateParameter(); 
     parameter.DbType = System.Data.DbType.String; 
     parameter.ParameterName = "@Username"; 
     parameter.Value = AddUsernameTextBox.Text; 
     command.Parameters.Add(parameter); 

     parameter = dbProviderFactory.CreateParameter(); 
     parameter.DbType = System.Data.DbType.String; 
     parameter.ParameterName = "@Password"; 
     parameter.Value = AddPasswordTextBox.Text; 
     command.Parameters.Add(parameter); 

     var dbTransaction = dbConnection.BeginTransaction(); 
     try 
     { 
     command.ExecuteNonQuery(); 
     dbTransaction.Commit(); 
     } 
     catch (Exception) 
     { 
     dbTransaction.Rollback(); 
     throw; 
     } 
    } 
    } 

以上代码依赖的app.Config文件如下所示。当然,只有配置文件中的connectionStrings部分在这方面很重要

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="SomeConnectionName" providerName="System.Data.OleDb" connectionString="Your Provider Specific Connection String" /> 
    </connectionStrings> 
</configuration>