【问题标题】:C# TableAdapter Insert Method MissingC# TableAdapter 插入方法丢失
【发布时间】:2012-01-19 14:32:00
【问题描述】:

我正在为我的项目使用 C# VS2010 TableAdapter Wizard 来与我的数据库交互。我已经为这个适配器生成了我自己的插入、更新和删除命令,因为它使用连接并且不能生成自己的。我对此没意见,但不幸的是,当我创建插入命令时,我无法在 tableadapter 上调用“Insert()”方法。其他方法工作正常。

例如,

`this.joinTableAdapter = new MyTableAdapter();

this.joinTableAdapter.Insert()

我的理解是,一旦您创建了一个有效的插入命令,该方法应该在表适配器上可见。我错了吗?它适用于我的更新和删除命令。任何想法我做错了什么?

感谢任何帮助。谢谢大家!

【问题讨论】:

  • 我猜 Insert() 是一个静态方法。由于某种原因,我在 msdn 文档中找不到 DataTable。
  • 我一直在为我的项目使用数据集。它确实提到了表适配器中的 .Update() 方法,但没有提到 .Insert()。奇怪..

标签: c# sql visual-studio-2010 sql-server-2008 tableadapter


【解决方案1】:

TableAdapter GenerateDbDirectMethods

除了 InsertCommand、UpdateCommand 和 DeleteCommand 之外,TableAdapter 还使用可直接针对数据库执行的方法创建。可以直接调用这些方法(TableAdapter.Insert、TableAdapter.Update 和 TableAdapter.Delete)来操作数据库中的数据。

如果您不想创建这些直接方法,请将 TableAdapter 的 GenerateDbDirectMethods 属性设置为 false(在“属性”窗口中)。添加到 TableAdapter 的其他查询是独立查询——它们不会生成这些方法。

您可以在倒数第二页的设计器中找到此选项。 创建将更新直接发送到数据库的方法

注意:这和点击高级选项不一样,然后点击:

生成插入、更新和删除语句

当您选择此选项时,向导将尝试根据“生成 SQL 语句”页面上定义的 SELECT 语句生成 INSERT、UPDATE 和 DELETE 语句。


编辑:

当主选择查询中涉及多个表时,TableAdapter 无法自动创建插入、更新和删除语句。如果您需要一列或多列相关表,有几种方法,最好的方法取决于您的要求。

  1. 手动向 TableAdapter 添加插入、更新和删除查询。这些方法可以直接从 TableAdapter 的实例中调用(f.e. InsertUser(param1,param2))
  2. 手动向 TableAdapter 添加插入、更新和删除命令(设计器或以编程方式)。当您调用Update 时,这些命令将从 TableAdapter 隐式触发。 DataRow 的RowState 确定将触发哪个命令(例如,Added->InsertCommand)。
  3. 选择一个表并通过与数据集中其他表的关系连接这些表

对于第三种方法,您可以使用LINQ-To-DataSet 连接相关表以获取所有需要的列(例如,为 GridView 创建数据源)。

【讨论】:

  • 嗨,蒂姆,感谢您的快速回复。我无法使用 GenerateDbDirectMethods,因为我的 select 语句中有一个 innerjoin,它不起作用。我之前已经通过这两个链接,他们似乎没有解释为什么我会遇到这个问题。我已经手动添加了这个插入查询,但是它好像没有识别出 tableadapter 里面有这个命令。
  • 如果主选择查询中涉及多个表,则 TableAdapter 无法创建插入、更新和删除语句。您需要手动添加相应的查询到 TableAdapter 或只选择一个表并通过 DataSet 中的关系连接这些表。
  • 我不希望它为我创建它们!我已经为表适配器手动创建了插入命令。但是,当我实际尝试从表适配器调用 Insert 时,它不存在!为什么!我的 tableadapter.Update() 工作得非常好,而且我以完全相同的方式完成了它。悲伤的熊猫:(。
  • @ImGreg:我认为您正在混合将查询添加到 TableAdapter(我的意思)和设置 InsertCommand(您的意思)。第一个可以通过编程方式在 TableAdapter 上调用(例如,您添加了一个方法 InsertUser(param1,param2,...))。如果您根据每个DataRow的当前RowState调用TableAdapter.Update(DataTable)TableAdapter.Update(DataRow),后者将被隐式调用。
  • 啊,我明白了。你是对的,我指的是InsertCommand。这就是我进行更新的方式,如果可能的话,我希望以同样的方式插入。知道为什么我的方式可能行不通吗?另一种做事方式使我的程序复杂化了很多。 (即发送查询 30 个正确转换的数据行与发送数据集)
【解决方案2】:

还有第 4 种处理 JOIN 查询的方法。

对于表适配器的主查询,省略连接。然后,手动将列添加到数据表中,并将它们的 SourceColumn 设置为您将添加的字段的精确拼写。最后,向包含连接的表适配器添加一个新查询,并调用此查询来填充应用程序中的数据表。

如果这太缩写了,请告诉我。我会详细说明。

【讨论】:

    【解决方案3】:

    进入数据集点击 tableadaptor 并检查属性“GenerateDBDirectMethods”的设置 - 需要为真

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多