向适配器添加参数

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 添加邮件适配器

在 Alamofire 的请求适配器中添加 GET 参数

如何在 recyclerview 适配器中将动态视图添加到 android 布局

怎样向android的Gallery里动态添加图片?

在单个适配器中包含多个 JS 文件

以编程方式向 recyclerview 添加新项目?