【发布时间】:2019-06-14 19:14:44
【问题描述】:
在 datagridview1 中选择一个值后,我需要填充 datagridview2。我通过从 dgv1 中提取键值并将它们添加到 SQL 脚本中来做到这一点,该脚本被馈送到填充数据集的适配器,该数据集又显示在 dgv2 中。
我的代码在 99.9% 的时间里都能正常工作。但是,偶尔传递的值会破坏代码。因此,我想通过添加参数而不是将值直接转储到脚本中来改进我的 SQL 查询创建。增加的安全性是这项任务的一个很好的副作用。
我相信我快到了,我只是无法将参数传递到我的脚本中。
这是我当前运行良好的代码,除非将错误值作为 varValues 之一传递...
string sql = @"select distinct Value1, Value2, Value3 from vSourceView where value1 = " + varValue1 + " and value2 = " + varValue2;
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
DataSet da = new DataSet();
da.Tables.Add(sql);
adapter.Fill(da, sql);
dataGridView2.DataSource = da;
dataGridView2.DataMember = sql;
这是我的“新”代码不起作用...
string sql = "select distinct Value1, Value2, Value3 from vSourceView where Value1 = @value1 and Value2 = @value2";
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
adapter.SelectCommand.Parameters.AddWithValue("@value1", varValue1);
adapter.SelectCommand.Parameters.AddWithValue("@value2", varValue2);
//added for testing
textBox1.Text = sql;
DataSet da = new DataSet();
da.Tables.Add(sql);
adapter.Fill(da, sql);
dataGridView2.DataSource = da;
dataGridView2.DataMember = sql;
参数未传递到脚本中。当我运行应用程序时,textBox1 显示“从 vSourceView 中选择不同的 Value1、Value2、Value3,其中 Value1 = @value1 和 Value2 = @value2”并且 dgv2 未填充。
我错过了什么?
提前致谢。
PS
“破坏”我当前代码的实际值是“VBA.MEDICAL”。我怀疑是“VBA”。是保留字符串...
【问题讨论】:
-
da.Tables.Add(sql);dataGridView2.DataMember = sql;这些行没有意义。 sql 是一个 sql 字符串,而不是某个东西的名称。大多数程序员会使用“ds”作为 DataSet 的变量名,“da”听起来像一个适配器。 -
你可能只想要
dataGridView2.DataSource = da.Tables[0]; -
the added security is a nice side affect-ha!真的吗?在这里,安全应该是您的第一优先事项。尤其是当它经常被认为是the most dangerous vulnerability。 -
@LarsTech 我现有的作品很好地使用了我发布的值。除非通过了错误的值。更改我的新测试代码和原始代码中的值会导致错误(“无法创建字段 [sql] 的子列表”)。无论哪种方式,这解决了我的原始代码,而不是传递参数的问题。
标签: c# sql datagridview sqldataadapter