【问题标题】:Why is my insert command not changing the database?为什么我的插入命令没有改变数据库?
【发布时间】:2014-02-01 19:28:13
【问题描述】:

我正在使用 oledb 方法在 c# 程序中执行插入 sql 命令,如下代码所示。

该操作已执行,它甚至向我显示了一条消息,我已经放在那里表明它是否有效,但是当我手动打开数据库时,我使用代码插入的数据不会出现

我使用 c# 和 Acess 作为数据库

类型数据库中的表

时间 = 时间/日期

标题 = 文本

重要性 = int

正文 = 文本

至于代码中的变量都是字符串,但我使用 datetimepicker 允许用户通过选择而不是键入来选择日期

OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
conn1.Open();
string sql = "INSERT INTO notes ([time], [Header], [importance], [body])" + "VALUES ('" + dateTimePicker1.Value + "', '" + textBox1.Text + "','" + int.Parse(comboBox1.Text) + "','" + textBox2.Text + "');";
OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
try
{
    OleDbDataReader rd2 = cmd2.ExecuteReader();
    conn1.Close();
    MessageBox.Show("Added");
}
catch(Exception ex)
{
    MessageBox.Show(ex.ToString());
}
this.Close();

【问题讨论】:

  • 伙计们,我更改了命令执行,这是有道理的,但它不起作用我会更新代码
  • ExecuteNonQuery() 函数用于将数据插入数据库

标签: c# sql ms-access oledb oledbcommand


【解决方案1】:

问题1:您在将数据插入数据库时​​调用ExecuteReader() 方法。

解决方案1:您需要使用ExecuteNonQuery()方法执行INSERT,UPDATEDELETE命令。

替换这个:

OleDbDataReader rd2 = cmd2.ExecuteReader();

有了这个:

cmd2.ExecuteNonQuery();

问题 2: 您将 DateTime 值作为字符串分配到 time 列中。如果time 列不支持字符串格式,则INSERT 操作将不会成功。

解决方案 2: 所以我建议你使用Parameterised queries 有以下两个原因:

  1. 主要是parameterised queries防止SQL Injection Attacks发生。
  2. parameterised queries 将发送带有正确数据类型的 parameters

建议:在检查命令执行状态时,需要读取ExecuteNonQuery()方法的返回值。因为它返回的是命令执行后插入表的总行数。因此只有当返回的计数大于零时,您才能阅读并显示成功消息。

完整代码:

    int status=0;
    OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
    conn1.Open();
    string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) " + "VALUES (?,?,?,?);";
    OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
    cmd2.Parameters.AddWithValue("@time",dateTimePicker1.Value);
    cmd2.Parameters.AddWithValue("@Header",textBox1.Text);
    cmd2.Parameters.AddWithValue("@importance",int.Parse(comboBox1.Text) );
    cmd2.Parameters.AddWithValue("@body",textBox2.Text);
    try
    {
       status=cmd2.ExecuteNonQuery();
       conn1.Close();
       if(status>0)
       MessageBox.Show("INSERT Command Executed Successfully!");
       else
       MessageBox.Show("INSERT Command Failed!");
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    this.Close();

【讨论】:

  • @user3261119:您需要正确发送 DateTime 值检查我的答案 solution2
  • iv 尝试了解决方案 2,并从 catch 异常消息框中获得了错误列表,我会写下错误给我一些时间 :)
  • System.data.Oledb.oledbexception (0x80040e07) System.Data.Oledboledbcommand.executecommandtexterrorhandeling(oledbHresult hr) 在系统 data.oledb.oledbcommand.executecommandtextfor singleresult(tagDBP ARAMs db params 对象和执行结果
  • 有没有更好的方法将日期传递到数据库中
  • @user3261119:我认为 OLEDB 不允许命名参数,因为它使用位置参数,所以给?问号而不是插入 uery 中的命名参数,检查我编辑的答案。
【解决方案2】:

我不是一个真正的 c-sharp 程序员,但你实际上不应该将 cmd.executeReader() 分配给一个变量,我认为你应该只在该行上编写命令以便它执行

【讨论】:

    【解决方案3】:

    您需要使用ExecuteNonQuery 对数据库执行插入查询。

    cmd2.ExecuteNonQuery();
    

    ExecuteReader 当您想从数据库中检索数据时使用,例如在SELECT 查询中。

    另外请使用参数化查询来避免Sql Injection

    string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) VALUES (@time, @header, @importance, @body);";
    
    cmd2.Parameters.AddWithValue("@time", Convert.ToDateTime(dateTimePicker1.Value));
    cmd2.Parameters.AddWithValue("@header", textBox1.Text);
    cmd2.Parameters.AddWithValue("@importance", Convert.ToInt32(comboBox1.Text));
    cmd2.Parameters.AddWithValue("@body", textBox2.Text);
    
    cmd2.ExecuteNonQuery();
    

    【讨论】:

    • 您没有创建命令 obj,也没有将查询和连接 obj 分配给命令构造函数,如 SqlCommand cmd=new SqlCommand(sql,con);那么如何在初始化命令类实例和传递引用之前调用 ExecuteNonQuery() 方法。
    • @Muhammad 我们不是来写完整代码的。我们只是把问题的解决方案。 OP完成的其余事情。所以在这里我只关注问题及其解决方案,而不是编写完整的代码。
    • 好的,我可以理解,但是如果有新用户想要解决方案并且无法理解您的代码流程,那是因为我评论了您的代码...谢谢@Sachin
    【解决方案4】:

    尝试类似的方法希望它有所帮助

    OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
            conn1.Open();
            string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) " + "VALUES (?,?,?,?);";
            OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
            cmd2.CommandType = CommandType.Text;
            cmd2.Parameters.Add("@time", OleDbType.Date).Value = DateTime.Parse(dateTimePicker1.Value);
            cmd2.Parameters.Add("@Header", OleDbType.VarChar).Value = textBox1.Text;
            cmd2.Parameters.Add("@importance", OleDbType.Integer).Value = int.Parse(comboBox1.Text);
            cmd2.Parameters.Add("@body", OleDbType.VarChar).Value = textBox2.Text;
            try
            {
                status = cmd2.ExecuteNonQuery();
                conn1.Close();
                if (status > 0)
                    MessageBox.Show("INSERT Command Executed Successfully!");
                else
                    MessageBox.Show("INSERT Command Failed!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            this.Close();
    

    【讨论】:

      【解决方案5】:

      您不能使用 cmd2.ExecuteReader 将记录插入数据库,您必须使用 cmd2.ExcuteNonQuery();执行插入更新或删除等操作。

      OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Database.accdb");
            conn1.Open();
          string sql = "INSERT INTO notes ([time], [Header], [importance], [body]) VALUES ('" + dateTimePicker1.Value + "', '" + textBox1.Text + "','" + int.Parse(comboBox1.Text) + "','" + textBox2.Text + "');";
          OleDbCommand cmd2 = new OleDbCommand(sql, conn1);
          try
          {
             cmd2.ExecuteNonQuery();
              
              MessageBox.Show("Added");
          }
          catch(Exception ex)
          {
              MessageBox.Show(ex.ToString());
          }
          finally
          {
          conn1.Close();
          }
      

      【讨论】:

      • OleDbDataReader rd2 = cmd2.ExecuteNonQuery(); 它甚至可以编译吗?
      • 代码生成异常并被catch块捕获或处理
      • 尝试在你的编辑器中写上一行。它甚至不会编译。在代码运行之前不会发生异常。
      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2018-01-25
      相关资源
      最近更新 更多