如何将TableAdapterManager和相关的数据表与SQL查询结合使用

时间:2015-04-16 14:30:50

标签: c# sql-server database datatable tableadapter

我有一个关于如何正确使用相关数据表以及如何在后端源数据库中正确实现它们的问题。

情况如下:

  1. 我有一个SQL数据库(SQL Server),它是基本数据源。在这里,表格可以通过外键相互关联。

  2. 这个SQL数据库用于通过SQL查询填充数据表。生成的数据表用于显示公式上的信息

  3. var query = new SqlCommand(_sqlquery, connection);
    var sqlAdapter = new SqlDataAdapter(query);
    sqlAdapter.Fill(dataTable);
    
         

    ...

    这里我使用sql查询将所需信息输入到我的数据表中,例如:

      

    SELECT * FROM [order] INNER JOIN customer ON [order] .customerID =   customer.customerID;

    到目前为止,数据网格中的可视化效果非常好。

    但是当尝试在源数据库数据库中保存对数据网格中可视化数据的修改时问题正在上升。

    我在互联网上搜索了很多,解决方案似乎是使用TableAdapterManager。问题是,我并不真正了解如何连接我的代码,我已经用TableAdapterManager可视化数据,这可以实现sql数据库中的数据。

2 个答案:

答案 0 :(得分:2)

让我再添一个答案 - 一步一步解释很容易。我会在需要时编辑/添加更多细节。

1。从创建新数据集开始,添加您需要的数据表。 添加新的tableadapter - 它还将根据您的或默认查询创建数据表。 Tableadapter可能有很多查询 - 它们用于从db填充数据表。

从简单查询开始:

select * from customers

select *, computedField1 = 'abc', computedField2 = 123 
from customers 
where 1=0

这个“第一个”查询是“假的”(“其中1 = 0”告诉你它永远不会被使用)和声明,从单个表,没有参数。通常,您永远不会检索没有参数或连接的所有数据。此查询“允许”设计者创建结构和更新语句,识别主键。

然后添加另一个查询:

FillById

select * 
from customers 
where custId = @custId

FillByName

select * 
from customers 
where custname like (@ss + '%')

FillByRecent

select cc.*
from customers cc
inner join orders oo on cc.custId = oo.custId   // get only customers with orders
where oo.orderdate > @dtFrom

您将在代码中调用它们:

taCustomer.FillByName(ds.customers, "AAA");    // all started from "AAA"

对订单执行相同操作

2. 创建关系

点击客户列custId之前的灰色空格 - 它将选择列。拖动选中并放入订单

中的custId

3. 添加表单

编译后,您将数据集添加到“数据源”窗口。选择您的表单,将客户从“数据源”窗口拖到您的表单 - 它将创建grig并添加组件以形成:dataset,binding source,tableadapter。

也添加订单。

查看网格中的属性“datasource”和“datamember”以及绑定源:

  • bsCustomer将引用ds - customer
  • bsOrders将引用customer - customers_orders_relation

4. 加载/更新

form_load()电话

taOrders.FillBySomething(ds.orders, ...)
taCustomer.FillByAnotherSomething(ds.customers, ...); 
<保存按钮

下的

taOrders.Update(ds.orders); // will update only modified content
taCustomer.Update(ds.customers);

答案 1 :(得分:0)

您使用加入。它的组合结果来自2个表,这对于查看很有用,但是对于更新感到困惑(但它仍然可能)。您的结果如下。如果用户进行此类修改,您的期望是什么:

ord1 cust1   --> cust1a
ord2 cust1   --> cust1b
ord3 cust2
ord4 cust2

通常如果需要更新,创建2个表dtOrders和dtCustomers并在c#中设置它们之间的关系(我喜欢使用设计器:添加数据集,为订单和客户添加tableAdapters,将customerId从一个表拖到另一个表来设置关系)。删除表单数据集,Tableadapters,bindingSources和cofigure orderDatasource以从customerDatasource-&gt; yourRelation获取数据。获取每个表的数据。

注意。对于winform应用程序,使用数据集和tableadapter更为可取。对于web,通常使用更轻量级的构造,以避免在每个请求上重新使用havy对象。

customerTableAdapter.Fill(ds.dtCustomers);
ordersTableAdapter.Fill(ds.dtOrders);

然后您可以使用关系显示2个网格(主要细节)或一个格栅。 在您的数据表中,您将不会有重复的客户,更新不会令人困惑。

如果您需要在一个事务中使用更新表,则可以使用TableAdapterManager。如果不重要,您可以在没有TableAdapterManager的情况下进行更新。


以其他方式,您可以将单表适配器与join一起使用,并根据需要创建自己的更新statemtes:

ta.updateOrderMethod1(row1)     // Update orders set ... where ordId = @ordId
ta.updateOrderMethod2(row1)     // spUpdateOrder(ordId = @ordId)
ta.updateCustomer(row1)         // Update customer set ... where customerId = @customerId
ta.updateCustomerNameOnly(row1) // Update customer set customerName=@customerName where customerId = @customerId