【问题标题】:How to execute 2 Sql statements with one button click如何一键执行2条Sql语句
【发布时间】:2011-09-13 03:06:16
【问题描述】:

我已设法使用 wamp 运行此查询。

INSERT INTO guest (guestno,familyname)
    VALUES(NULL,'Damn');      

INSERT INTO reservation (reservationno, guestno)
    VALUES(NUll,LAST_INSERT_ID())

但是,如果我分别执行这 2 个插入语句,我将有一个外键约束。 我认为他们两个需要同时执行。

我的问题是:

  1. 如何将其合并到我的 c# winform 代码中?
  2. 是否可以在一个按钮上有 2 个插入语句?

当用户按下“添加预订”时,我希望执行两个 MySQl 查询。

这是我的插入语句:

private void button7_Click(object sender, EventArgs e)
        {
    string connectionString =
            "Server=localhost;" +
        "Database=sad;" +
        "User ID=root;" +
        "Password=root;" +
        "Pooling=false";

        IDbConnection dbcon;
        dbcon = new MySqlConnection(connectionString);
        dbcon.Open();

        IDbCommand dbcmd = dbcon.CreateCommand();
        string sql = "<insert statement>";
        dbcmd.CommandText = sql;
        IDataReader reader = dbcmd.ExecuteReader();
        reader.Read(); 

}

更新版本(不起作用)

string connectionString =
         "Server=localhost;" +
         "Database=sad;" +
     "User ID=root;" +
     "Password=root;" +
     "Pooling=false";
    Form3 f3 = new Form3();

        IDbConnection dbcon;
        dbcon = new MySqlConnection(connectionString);
        dbcon.Open();
        IDbCommand dbcmd = dbcon.CreateCommand();
        string sql = "insert into guest (guestno, familyname) values (null, '" + textBox6.Text + "'); insert into reservation (reservationno, guestno) values (null, LAST_INSERT_ID())";
        dbcmd.CommandText = sql;

        IDataReader reader = dbcmd.ExecuteReader();
        reader.Read();
        MessageBox.Show("Added Guest Reservation Successfully");
        f3.guestList();
        f3.reservationList();

更新了 3 号(仍然不起作用)

string connectionString =
             "Server=localhost;" +
             "Database=sad;" +
             "User ID=root;" +
             "Password=root;" +
             "Pooling=false";

            IDbConnection dbcon;
            dbcon = new MySqlConnection(connectionString);
            dbcon.Open();
            IDbCommand dbcmd = dbcon.CreateCommand();
            dbcmd = new MySqlCommand("CreateGuestAndReservation", dbcon);
            dbcmd.CommandType = CommandType.StoredProcedure;
            dbcmd.Parameters.AddWithValue("familyName", "foo");
            dbcmd.ExecuteNonQuery();
enter code here

【问题讨论】:

  • 尝试创建一个存储过程,这将允许您通过一次对MYSQL的执行调用来执行多项操作。

标签: c# database visual-studio-2010 insert


【解决方案1】:

您不能对给定的 MySqlCommand 执行多个语句。

您最好的选择(可维护性、性能、可读性)是:

  • 为您的 2 个 SQL 语句创建一个 MySQL 存储过程。
  • 使用ExecuteNonQuery() 调用您的存储过程。
DELIMITER //
CREATE PROCEDURE CreateGuestAndReservation
(
   IN familyName VARCHAR(255)
)
BEGIN
    insert into guest (guestno, familyname) 
     values (null, familyName); 

    insert into reservation (reservationno, guestno) 
    values (null, LAST_INSERT_ID());

END//
DELIMITER ;

从您的 WinForms 代码中调用它,如下所示:

dbcon.Open();
cmd = new MySqlCommand("CreateGuestAndReservation", dbcon);
cmd.CommandType = CommandType.StoredProcedure;
//cmd.Parameters.AddWithValue("?familyName", "foo");
cmd.Parameters.Add("?familyName", MySqlDbType.VarChar,255).Value = "foo";
cmd.ExecuteNonQuery();

【讨论】:

  • 每当我尝试创建过程时都会遇到语法错误。第 10 行附近的错误
  • 它仍然有错误先生。 .Addwithvalue 和新的 Mysql 命令。我已经更新了我的帖子,这样你就可以看到我做了什么
  • 非常感谢坎贝尔先生 :)
【解决方案2】:

下面的代码应该可以工作,但鉴于您正在寻求帮助,我怀疑您可能已经尝试过?

string sql = "INSERT INTO guest (guestno,familyname) VALUES(NULL,'Damn'); INSERT INTO reservation (reservationno, guestno) VALUES(NUll,LAST_INSERT_ID())";

如果你需要参数,试试这个:

string sql = "INSERT INTO guest (guestno,familyname) VALUES(NULL,?familyName); INSERT INTO reservation (reservationno, guestno) VALUES(NUll,LAST_INSERT_ID())";
...
dbcmd.Parameters.Add("@familyName", MySqlDbType.VarChar, 80).Value = _familyName;

编辑:您可能需要运行 2 个插入命令。见here

【讨论】:

  • 我要放什么?我不知道如何执行我的查询
  • 我试过 dbcmd.ExecuteNonQUery() 但还是不行
  • 是的,它只添加了guest table的insert语句而不是reservation
【解决方案3】:

我建议有一种方法来获取 id,而不是依赖自动 id 生成,例如 mysql 和 sql server 的自动增量,这是非常有限的。如果您使用 HILO id 生成器,您首先获取 id,然后在单个事务中执行几个插入没问题,因为您事先知道您的父 id。

它不会解决您当前的问题,但它将极大地帮助您的应用程序,特别是如果存储像数据这样的父子数据会经常发生。

【讨论】:

    【解决方案4】:

    试试这个,它会起作用的:

        private void button56_Click(object sender, EventArgs e) {
            con.Open();
            SqlCommand cmd = new SqlCommand("insert into stholidays values('" + dateTimePicker12.Text + "','" + dateTimePicker20.Text + "','" + dateTimePicker13.Text + "','" + mbk + "','" + dateTimePicker14.Text + "','" + dateTimePicker15.Text + "','" + lt + "','" + dateTimePicker16.Text + "','" + dateTimePicker17.Text + "','" + ebk + "','" + dateTimePicker18.Text + "','" + dateTimePicker19.Text + "','" + textBox105.Text + "','" + textBox106.Text + "','" + textBox107.Text + "','" + dd + "','" + textBox104.Text + "')", con);
            SqlCommand cmd1 = new SqlCommand("insert into holidays values('" + dd + "','" + ms + "','" + day + "','" + textBox104.Text + "')", con);
            cmd.ExecuteNonQuery();
            cmd1.ExecuteNonQuery();
            con.Close();    
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 2014-05-23
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      相关资源
      最近更新 更多