【问题标题】:How to fix Messagebox popping twice and the error on ExecuteNonQuery如何修复 Messagebox 弹出两次和 ExecuteNonQuery 上的错误
【发布时间】:2019-04-05 07:15:04
【问题描述】:

我有这个datagridview,我需要在其中插入它上面的任何内容。所以我的datagridview中有2行。每当我单击保存按钮时,它都会三次询问我的消息框。这个错误出现在 xcom.ExecuteNonQuery();

这是错误:

参数化查询'(@id nvarchar(4000),@idtran nvarchar(4000),@qty nvarc' 需要参数 '@id',它 未提供。

我检查了数据库,它从 datagridview 中插入了正确数量的行。我想知道为什么消息框会出现 3 次询问我,然后是错误。

请帮助我,我是 C# 新手,还在学习。

private void button9_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView2.Rows)
            {
                string query = @"INSERT INTO MED (id,idtran,qty,user)
                                            Values(@id,@idtran,@qty,@user)";

                using (SqlConnection xcon = new SqlConnection(@"Server=MEAND;Database=SHC;Integrated Security=SSPI;"))
                {
                    using (SqlCommand xcom = new SqlCommand(query, xcon))
                    {
                        xcon.Open();
                        xcom.CommandType = CommandType.Text;
                        xcom.Parameters.AddWithValue("@id", row.Cells["id"].Value);
                        xcom.Parameters.AddWithValue("@idtran", row.Cells["idtran"].Value);
                        xcom.Parameters.AddWithValue("@qty", row.Cells["qty"].Value);
                        xcom.Parameters.AddWithValue("@user", row.Cells["user"].Value);
                        xcom.ExecuteNonQuery();

                        try
                        {
                            DialogResult result1 = MessageBox.Show("Are you sure you want to save this?",
                            "Important Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                            if (result1 == DialogResult.Yes)
                            {
                                Medi b = new Medi();
                                b.Show();
                                this.Hide();
                            }
                        }

                        catch (Exception)
                        {
                            throw;

                        }
                        finally
                        {
                            xcon.Close();
                        }
                    }
                }
            }
        }

【问题讨论】:

  • 错误信息与发布的代码不对应
  • MessageBox 弹出多次,因为它在一个 foreach 中,这是微不足道的还是我错过了什么?
  • @koviroli 我把代码的排列搞砸了吗?无论我从 datagridview 获得多少行,它都应该只弹出一次。
  • @meandyou 您的 MessageBox 将弹出与您的 datagridview 的行数一样的次数。如果您仔细观察,它在您的 foreach 循环内。
  • @koviroli 谢谢你让我知道。我在 foreach 循环的花括号之后更改了它。但是错误“参数化查询'(@id nvarchar(4000),@idtran nvarchar(4000),@qty nvarc'需要参数'@id',没有提供。”仍然没有修复。:(跨度>

标签: c# sql


【解决方案1】:

类似这样的:(为简单起见,我省略了消息框代码)

        DataGridViewRow row;
        string query = @"INSERT INTO MED (id,idtran,qty,user)
                            Values(@id,@idtran,@qty,@user)";
        using (SqlConnection xcon = new SqlConnection(@"Server=MEAND;Database=SHC;Integrated Security=SSPI;"))
        {
            try
            {
                xcon.Open();
                for (int n=0;n<dataGridView2.Rows.Count-1;n++)
                {
                    row=dataGridView2.Rows[n];
                    using (SqlCommand xcom = new SqlCommand(query, xcon))
                    {
                        xcom.CommandType = CommandType.Text;
                        xcom.Parameters.AddWithValue("@id", row.Cells["id"].Value);
                        xcom.Parameters.AddWithValue("@idtran", row.Cells["idtran"].Value);
                        xcom.Parameters.AddWithValue("@qty", row.Cells["qty"].Value);
                        xcom.Parameters.AddWithValue("@user", row.Cells["user"].Value);
                        xcom.ExecuteNonQuery();xcom.Dispose();
                    }
                }                   
            }
            catch
            {
                //do what you need
            }
            finally
            {
                xcon.Close();
            }
        }

如果您的数据网格中有很多行存在性能问题,请考虑this post

【讨论】:

  • 谢谢。我已经改变了。我在 button_click 中添加了一个断点以查看发生了什么,我尝试在我的 datagridview 中仅输入 1 行,它读取第一行,然后返回到 foreach 循环,这意味着它已经为 null 这就是为什么它给了我错误。有没有办法停止循环?还是先计算行数,这样它才能知道循环多少次?
  • @meandyou 在哪个语句中得到空值?您可以随时使用“break;”停止循环。声明。
  • 当我的数据网格视图中有 1 行时,它会读取两次 foreach。当我有 2 行时,它会读取三次 foreach。因此,如果我有 1 行,并且读取了两次,则第 2 行为空。
  • 啊!现在我看到了问题。 datagridview默认有一个空行,方便其他人添加新行。所以最好像这样替换foreach循环“for(int i = 0; i
  • 谢谢! Tsungur,非常感谢你!它正在工作!我哭了!谢谢你帮助我。
猜你喜欢
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多