0

我已经在我的数据集上创建了一个带有下一个选择命令的 tableadapter

select count(*) as cuenta from table1.

但是,在运行时,我需要用可变数量的子句组合不同的选择。我想使用相同的 tableadapter,但我无法更改 select 命令。

这是我的问题的一个小例子:

数据源“ds”上数据适配器“EXISTE”的原始选择命令:

select 1 as cuenta(*)

在设计器上,我删除了数据适配器以在我的表单上创建一个实例:“EXISTE1”

代码:

EXISTE1.Adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("select 2255 as cuenta");
EXISTE1.Fill(ds.EXISTE);

但它总是返回“1”作为结果,而不是 2255。

如何在不创建新的 Fill 函数的情况下运行其他命令?

此致

4

2 回答 2

0

此问题的解决方案是从 Adapter 而不是 TableAdapter 填充数据集。这对我来说效果很好。

EXISTE1.Adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("select 2255 as cuenta");
EXISTE1.Adapter.Fill(ds.EXISTE);
于 2020-05-10T09:42:55.987 回答
0

您应该通过在设计器中右键单击它并选择“添加查询”来向 tableadapter 添加更多查询,尽管从发布的查询中将值 2255 插入数据表而不是运行选择查询会更简单一个常数。

myDataset.EXISTE.AddEXISTERow(2255);

如果您查看designer.cs,您会发现TA 知道的多个查询保存在一个集合中,并且在每次填充之前将相关查询加载到select 命令中,这解释了为什么您的努力没有效果;当您填写时,您的新选择命令将被覆盖

如果您的查询是真正动态的,并且无法提前编写脚本,那么最好只使用常规 DataAdapter 和动态构建的命令和自定义参数集来填充表格。您可以通过双击设计器中的 tableadapter 将其作为代码添加到 tableadapter 中,以打开后面的代码(设计器创建了一个部分类,因此很容易扩展)并添加如下内容:

void FillByVariable(EXISTEDataTable dt, string sql, Dictionary<string,object> p){
  using(var da = new XxxDataAdapter(sql, this.Connection.ConnectionString) //new da that uses the same conn as the TA
  {
    foreach(var kvp in p)
      da.SelectCommand.Parameters.AddWithValue(kvp.Key, kvp.Value); //demo code, read Joel's "can we stop using AddWithValue" blog and make something better if you use sql server
  }
  da.Fill(dt)
}
于 2020-09-16T05:35:56.647 回答