【问题标题】:Refresh database after execute a query and execute another query执行查询后刷新数据库并执行另一个查询
【发布时间】:2018-12-26 17:26:09
【问题描述】:

回答

在阅读结束之前清除文本框是一个错误。

感谢@muhammad-azim

结束回答

我首先在数据库中有 2 个插入,第二个对第一个有一个外键。 执行第二个INSERT 时出现错误:

INSERT 语句与 FOREIGN KEY 约束冲突

这部分出错了

代码:

SqlConnection con1 = new SqlConnection(connectionString);

SqlCommand cmd1 = new SqlCommand(cmdString, con1);
con1.Open();

cmd1.ExecuteNonQuery(); // insert(987,10000,2019-07-27 12:00:00 AM)
con1.Close();

// Some Code

SqlConnection con2 = new SqlConnection(connectionString);

SqlCommand cmd2 = new SqlCommand(cmdString2, con2);
con2.Open()

cmd2.ExecuteNonQuery();//want insert(1,987,2000,2019-07-28 12:00:00 AM) but Got error
con2.Close();

两个查询都是INSERT

我认为 Connection 不理解更新的数据库并收到此错误。 当我停止应用程序并单独运行另一次第二次查询时,它可以工作(以前不起作用)

所有代码

        PersianCalendar pc = new PersianCalendar();
        string[] dateInfo = txtcreteDate.Text.Split('-');
        DateTime createDate = new DateTime(Convert.ToInt32(dateInfo[0]), Convert.ToInt32(dateInfo[1]), Convert.ToInt32(dateInfo[2]), pc);

        int companyid = 1;
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand("INSERT INTO Factors (compId,createDate, code, duration, value," +
            " discount , payType , payTypeInfo , status)" +
            "VALUES " +
            " (@compId,@createDate, @code, @duration, @value, @discount , @payType , @payTypeInfo , 1) ", con);
        cmd.Parameters.Add("@compId", companyid);
        cmd.Parameters.Add("@createDate", createDate);
        cmd.Parameters.Add("@code", txtCode.Text);
        cmd.Parameters.Add("@duration", Convert.ToInt32(txtDuration.Text));
        cmd.Parameters.Add("@value", Convert.ToDecimal(txtValue.Text));
        cmd.Parameters.Add("@discount", Convert.ToDecimal(txtDiscount.Text));
        cmd.Parameters.Add("@payType", companyid);
        cmd.Parameters.Add("@payTypeInfo", companyid);

        con.Open();
        try
        {
            var insertedItem = cmd.ExecuteNonQuery();
        }
        catch(Exception ez)
        {
            MessageBox.Show("شماره فاکتور تکراری است");
            return;
        }
        ClearTextBoxes();
        if (comboBox1.SelectedItem.ToString() == "نقد" && insertedItem >0)
        {
            for (int counter1 = 0; counter1 < cashDataGridView.Rows.Count; counter1++)
            {
                string status = "پرداخت نشده";
                PersianCalendar pc1 = new PersianCalendar();
                string[] dateInfoPay = cashDataGridView.Rows[counter1].Cells["date"].Value.ToString().Split('-');
                DateTime PayDate = new DateTime(Convert.ToInt32(dateInfoPay[0]), Convert.ToInt32(dateInfoPay[1]), Convert.ToInt32(dateInfoPay[2]), pc1);
                //System.Data.SqlClient.SqlConnection con1 = new System.Data.SqlClient.SqlConnection(connectionString);
                string cmdString = "INSERT INTO Payout (value,date,status,description,fid)";
                cmdString += " VALUES ";
                cmdString += " ( '" + Convert.ToDecimal(cashDataGridView.Rows[counter1].Cells["value"].Value.ToString()).ToString() + "' ,";
                cmdString += " '" + PayDate.ToString() + "' , ";
                cmdString += " '" + status.ToString() + "' , ";
                cmdString += " '" + status.ToString() + "' , ";
                cmdString += " '" + txtCode.Text + "' )";
                System.Data.SqlClient.SqlCommand cmd1 = new System.Data.SqlClient.SqlCommand(cmdString, con);
                MessageBox.Show(cmd1.CommandText.ToString());
                cmd1.ExecuteNonQuery(); // i got error here

            }
            con.Close();

【问题讨论】:

  • 提供的细节太少。但首先,在SqlConnectionSqlCommand 实例周围使用using。其次,这将取决于您的数据。检查两个插入之间的数据库。即使使用 Profiler,也可以精确检查刀片。第三,干!
  • 我使用 . FOREIGN Constraint 导致错误。它停止插入表中,因为表 1 中没有这样的 key 。但我已经在cmd1 中插入了这个
  • 请注意,visual-studio 标记用于与 Visual Studio 应用程序相关的问题,而不是您使用它编写的代码。
  • 您似乎对此很确定,但您检查过吗?记住:我们不看你的屏幕!
  • 我停止运行并检查数据库并评论第一个查询并单独执行第二个查询。它工作

标签: c# sql-server


【解决方案1】:

你这里有问题:

SqlConnection con1 = new SqlConnection(connectionString);
SqlCommand cmd1 = new SqlCommand(cmdString, con1);
con1.Open();
cmd1.ExecuteNonQuery();
con1.Close();

ExecuteNonQuery() 返回受影响的行数,如果没有受影响的行,则返回值为-1 并回滚到操作。

为了确保插入成功并且两个操作都成功完成,您应该始终使用 vlidations:

try
{
  SqlConnection con1 = new SqlConnection(connectionString);
  SqlCommand cmd1 = new SqlCommand(cmdString, con1);
  con1.Open();
  var rowsAffected = cmd1.ExecuteNonQuery();
  con1.Close();
  //Some Code
  if(rowsAffected > 0)
  {
    SqlConnection con2 = new SqlConnection(connectionString);
    SqlCommand cmd2 = new SqlCommand(cmdString2, con2);
    con2.Open()
    cmd2.ExecuteNonQuery();
    con2.Close();
  }
}
catch(Exception ex)
{
  //handle error in insert
} 

另请参考SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete

【讨论】:

  • 我检查一下。它返回1,但第二个查询有效。直到我关闭并打开应用程序。
  • @ZorgoZ 我不明白你说的可以解释更多吗?你的意思是我删除using 并在行中定义它?
  • 没有。 using 就是这样。调试时,不要停止它,只在第二次插入之前暂停(带断点)。然后检查分贝。并启动分析器以查看究竟发生了什么。但如果没有架构和示例数据,这可能是任何东西..
【解决方案2】:

您不需要使用两个连接对象。

 using(SqlConnection con1 = new SqlConnection(connectionString))
 {
  using(SqlCommand cmd1 = new SqlCommand(cmdString, con1))
   {
    con1.Open();

    //ExecuteNonQuery Method will return 0 or 1.
    bool result = Convert.ToBool(cmd1.ExecuteNonQuery());

   If insert is succsessful, you can try to execute the second query.
   if(result)
    {  
      If doesn't work, you should check your "Some Code" to be sure if you assign the the right parameters. 
      //Some Code
      cmd1.CommandText = cmdString2;
      cmd1.ExecuteNonQuery();
    }
  }
 }

【讨论】:

  • 它返回 1 我检查了它
  • 我发布了它,但我认为它不会有帮助
  • md1.ExecuteNonQuery() 这将返回受影响的行数!不是01
  • 是的,在这种情况下是 1 或 0。
猜你喜欢
  • 2013-09-05
  • 2016-08-09
  • 2020-08-18
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2018-08-12
  • 2017-11-14
相关资源
最近更新 更多