【问题标题】:C# INSERT TO access database creates 2 database entries rather than 1 [closed]C# INSERT TO 访问数据库创建 2 个数据库条目而不是 1 个 [关闭]
【发布时间】:2014-12-13 01:48:50
【问题描述】:

我创建了一个 C# 程序,用一些众所周知的代码将数据插入 Access 数据库。

每次我运行代码时,我都会在数据库中获得两个条目

namespace Quotes
{
public partial class QuotesForm : Form
{
    private OleDbConnection quotescon;
    private OleDbCommand oledbcmd = new OleDbCommand();
    private string connect = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\Quotes.mdb;Persist Security Info=False";

    public QuotesForm()
    {
        quotescon = new OleDbConnection(connect);
        InitializeComponent();
    }

    private void btn_insert_Click(object sender, EventArgs e)
    {
        int quote = Convert.ToInt32(txtb_Quotenumber.Text);
        quotescon.Open();
        oledbcmd.Connection = quotescon;
        oledbcmd.CommandText = "insert into table1 ([Quote number], Account, Made, Approved) values ('" + quote + "','" + this.txtb_name.Text + "','" + this.date_created.Text + "','" + this.comboBox1.Text +"');";
        oledbcmd.ExecuteNonQuery();
        int temp = oledbcmd.ExecuteNonQuery();
        if(temp > 0)
        {
            txtb_Quotenumber.Text = null;
            txtb_name.Text = null;
            MessageBox.Show("Entry has been Successfuly Added to Database","Data Added",MessageBoxButtons.OK,MessageBoxIcon.Information);
        }
        else
        {
            MessageBox.Show("Data entry has not been added Successfuly, Please try again", "Failed To add Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        quotescon.Close();

    }

【问题讨论】:

  • 您调用oledbcmd.ExecuteNonQuery() 两次,所以它正在执行 2 次插入。
  • 这是一个简单的调试就能解决的问题。

标签: c# mysql visual-studio-2010 ms-access


【解决方案1】:

因为您执行了两次命令。

一个与

oledbcmd.ExecuteNonQuery();

还有一个

int temp = oledbcmd.ExecuteNonQuery();

删除第一个即可。

来自SqlCommand.ExecuteNonQuery method

对连接执行 Transact-SQL 语句并返回 受影响的行数。

但更重要的是,您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。

并使用using statement 处理您的OleDbConnectionOleDbCommand

using(OleDbConnection quotescon = new OleDbConnection(connect))
using(OleDbCommand oledbcmd= con.CreateCommand())
{
    oledbcmd.CommandText = @"insert into table1 ([Quote number], Account, Made, Approved)
                            values(?, ?, ?, ?)";
    oledbcmd.Parameters.AddWithValue("@number", quote);
    oledbcmd.Parameters.AddWithValue("@account", this.txtb_name.Text);
    oledbcmd.Parameters.AddWithValue("@made", this.date_created.Text);
    oledbcmd.Parameters.AddWithValue("@approved", this.comboBox1.Text);
    int temp = oledbcmd.ExecuteNonQuery();

    if(temp > 0)
    {
        txtb_Quotenumber.Text = null;
        txtb_name.Text = null;
        MessageBox.Show("Entry has been Successfuly Added to Database","Data Added",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
    else
    {
        MessageBox.Show("Data entry has not been added Successfuly, Please try again", "Failed To add Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

【讨论】:

    【解决方案2】:

    您正在执行两次查询

    oledbcmd.ExecuteNonQuery();
    int temp = oledbcmd.ExecuteNonQuery();
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2019-05-06
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多