向适配器添加参数
Posted
技术标签:
【中文标题】向适配器添加参数【英文标题】:Add Parameters to Adapter 【发布时间】: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。
Trying to pass SqlCommand in SqlDataAdapter as parameters的可能重复
@LarsTech 我现有的作品很好地使用了我发布的值。除非通过了错误的值。更改我的新测试代码和原始代码中的值会导致错误(“无法创建字段 [sql] 的子列表”)。无论哪种方式,这解决了我的原始代码,而不是传递参数的问题。
【参考方案1】:
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);
*/
var dt = new Datatable();
adapter.Fill(dt);
dataGridView2.DataSource = dt;
// dataGridView2.DataMember = sql; // you don't need this.
【讨论】:
AddWithValue
应该避免 - 它使提供者猜测数据类型
@NatPongjardenlarp 我同意你的看法。我试图避免更改过多的 OP 代码。
我宁愿认为完整而完整的答案会更好地为 OP 和未来的读者提供服务
dgv2 在没有“dataGridView2.DataMember = sql;”的情况下根本不会填充线。不会产生错误,但也不会返回。
@kevin 那可能是因为你使用的是DataSet,所以需要在DataSet中指定DataTable的表名。这就是您的“sql”名称发挥作用的地方。此答案通过直接填充 DataTable 并将其用作 DataSource 来跳过该问题。以上是关于向适配器添加参数的主要内容,如果未能解决你的问题,请参考以下文章
Bitnami Parse Server Dashboard 添加邮件适配器