动态创建SQL插入语句时出错

时间:2011-02-14 04:13:55

标签: c# sql database ms-access oledb

我可以知道我的陈述有什么问题吗?我收到语法错误。一直试图找出错误的一整天。 :(

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

9 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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>

答案 2 :(得分:1)

最好的方法是使用参数:'@' 通过这种方式,您的代码将更加清晰易懂。并使您的应用程序更安全。

试试这段代码:

            using (var con = new OleDbConnection(_constring))
            {
                con.Open();
                using (
                    var cmd =
                        new OleDbCommand(
"UPDATE LogIn SET Username=@Username, Password=@Password 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();
                    }

                }

问候!

答案 3 :(得分:1)

请保护单引号。此外,您可能需要在Access SQL字符串中使用结束分号。

  

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

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

答案 4 :(得分:0)

ID列是整数吗?如果不是,您也需要用单引号括起值。 另外,请尝试删除括号。

答案 5 :(得分:0)

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

但是像丹尼尔指出的那样,这非常容易受到SQL注入......

如果我输入会发生什么:

' ; DROP TABLE login
在EditUserNameTextBox字段中

答案 6 :(得分:0)

检查这是否有效。您缺少WHERE语句中值的单引号:

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

另外,请确保,正如Daniel White所说,你会处理任何SQL注入。

答案 7 :(得分:0)

如果您的ID是非数字的,则错过了一对撇号:

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

答案 8 :(得分:0)

EditUsernameTextBox.TextEditPasswordTextBox.Text的值是否有引号?这样就可以了解SQL。

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

你是否打印出声明,看看它的要求是什么......?