为什么我的insert命令没有更改数据库?

时间:2014-02-01 19:28:14

标签: c# sql ms-access oledb oledbcommand

我正在使用oledb方法在c#程序中执行insert sql命令,因为代码将会显示。

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

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

类型为

的数据库中的表

时间=时间/日期

标头=文字

important = int

body = text

至于代码中的变量所有字符串但我使用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();

4 个答案:

答案 0 :(得分:0)

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

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

替换它:

OleDbDataReader rd2 = cmd2.ExecuteReader();

有了这个:

cmd2.ExecuteNonQuery();

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

解决方案2: 所以我建议您使用Parameterised queries,原因如下:

  1. 主要是parameterised queries阻止SQL Injection Attacks发生。
  2. parameterised queries会向parameters发送正确的数据类型。
  3. 建议:在检查命令执行状态时,需要读取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();
    

答案 1 :(得分:0)

您需要使用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();

答案 2 :(得分:0)

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

答案 3 :(得分: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.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();