【问题标题】:How to fill DataGridView Cells in MYSQL C#?如何在 MYSQL C# 中填充 DataGridView 单元格?
【发布时间】:2017-04-29 09:54:17
【问题描述】:

我有一个 4-5 列的 DataGridView。
DataGridView 是可编辑的。
当我在参考列中输入一个值时,它将立即填充其他值
mysql 数据库中其他单元格中的其他值。
这是我尝试过的......

private void TAB_Credit_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {

            try
            {
                if (TAB_Credit.CurrentCell.ColumnIndex == 0)
                {

                    MySqlDataAdapter sa = new MySqlDataAdapter("SELECT * FROM table WHERE Reference='" + TAB_Credit.Rows[e.RowIndex].Cells["Reference"].Value + "'", MyConnexion);
                    DataTable dt2 = new DataTable();

                    sa.Fill(dt2);

                        double value = (double)TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value * (double)TAB_Credit.Rows[e.RowIndex].Cells["PU"].Value;

                        TAB_Credit.Rows[e.RowIndex].Cells["Designation"].Value = dt2.Rows[0]["Designation"].ToString();
                        TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value = dt2.Rows[0]["Quantite"].ToString();
                        TAB_Credit.Rows[e.RowIndex].Cells["PU"].Value = dt2.Rows[0]["Prix_Unitaire"].ToString();
                        TAB_Credit.Rows[e.RowIndex].Cells["Total"].Value = value.ToString();


                    }

            }
            catch
            { }
        }

所以在数据网格中,当我在参考单元格中插入时,其他单元格中没有出现任何内容。 谢谢。

【问题讨论】:

  • 第一:不要写空的try/catch块。如果发生任何错误,您将永远不会知道。删除并检查是否有任何异常。然后贴出错误信息
  • 第二:如果有人在你的单元格中输入:1';DROP TABLE References;--,你认为会发生什么?不要这样做,看看这个stackoverflow.com/questions/332365/…
  • 错误来了这个double value = (double)TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value * (double)TAB_Credit.Rows[e.RowIndex].Cells["PU"].Value;,我有这个错误:System.InvalidCastException
  • 因此错误与单元格中存在的无效值有关。单元格中存在哪些值?这些值是否可以转换为双精度值?
  • 是的,数值是小数,比如 2500,00

标签: c# mysql datagridview


【解决方案1】:

您的代码中至少存在两个直接问题:

  • 第一:不要写空的 try/catch 块。如果发生任何错误 你永远不会知道。删除并检查是否有任何异常。
  • 第二:如果有人键入:1';DROP TABLE,你认为会发生什么 参考资料;——在你的牢房里?不做就看at this

现在,在删除空 catch 后,我们可以看到问题是由尝试将值相乘时出现的无效转换异常引起的 (quantity*PU)。这应该通过正确转换来自单元格的两个对象值来解决。

double qty = Convert.ToDouble(TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value);
double pu = Convert.ToDouble(TAB_Credit.Rows[e.RowIndex].Cells["PU"].Value);
double value = qty * pu;

但如果这些单元格是直接从您的用户输入的,那么 Convert.ToDouble 也有其缺点。如果输入类似于“ABC”,则会引发异常。在这些情况下,您使用 double.TryParse 并在输入不是有效的双精度时向您的用户发送消息

double qty;
if(!double.TryParse(TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value.ToString, out qty))
{
   MessageBox.Show("Invalid input for quantity");
   return;
}

最后我们需要使用参数化查询来修复 sql 注入漏洞

string cmdText = @"SELECT * FROM table 
                   WHERE Reference=@ref"
MySqlDataAdapter sa = new MySqlDataAdapter(cmdText, MyConnexion);
sa.SelectCommand.Parameters.Add("@ref", MySqlDbType.VarChar).Value = 
        TAB_Credit.Rows[e.RowIndex].Cells["Reference"].Value.ToString();

【讨论】:

  • 为什么它只适用于第一行?当我写第二行时,什么都没有填满……
  • 不知道,也许您应该问一个新问题,详细说明如何调用此代码。更多人将能够提供帮助
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多