0

我正在尝试在 ADO.Net 中构建一个强类型数据集,但在 TableAdapters 的一个方面遇到了一些麻烦。

我的查询看起来像

SELECT *
FROM testdict.ModuleVariable
WHERE Module = ?

我的问题围绕着 testdict 部分。我们使用几种不同的模式来访问我们的数据(因为多路复用的 Sybase IQ 实例)。如何参数化此查询的架构部分?

我试过了:

SELECT *
FROM ?.ModuleVariable
WHERE Module = ?

但无济于事。我目前的心态是我可能必须继承 TableAdapter 并手动参数化架构,但我希望有更好的解决方案!

提前致谢

4

2 回答 2

1

首先,您无法在设计时通过简单地添加选择查询来实现这一点。您不能对模式进行参数化。

但是,有一个解决方案。这是您可以做到的。

1.) 将表拖放到您的类型化数据集设计器中,这将为该表创建一个类型化数据表和用于访问数据库表的表适配器。表适配器知道数据表的模式。

2.) 现在在您的数据库中创建一个带有两个参数的存储过程。一个是[?.ModuleVariable] 的架构,另一个是您的where 子句,或者您可能想要的任何标准。您可以根据需要创建此重载。然后,这个存储过程将根据参数构造 sql 查询并在数据库上执行它。这会将结果集返回给调用 table-adapter

3.) 从设计视图中向 table-adapter 添加一个方法,该方法将从存储过程中获取结果。确保结果的架构完全符合关联数据表的架构

4.) 现在,您可以从代码中创建表适配器的实例并调用该方法,该方法又将调用您的存储过程并返回您填写的数据表结果

玩得开心!

于 2009-12-25T10:51:16.150 回答
1

您可以重载或向表适配器添加新函数,因为它们被定义为部分类。这个新函数将模式名称作为参数。例如,Fill(table As (tableName), schemaName As String)。这是我的做法:

  1. 创建一个新文件并将其命名为 (dataSetName).(whatever_you_like).vb。
  2. 在顶部放置命名空间 (dataSetName)TableAdapters。
  3. 使用 Import 语句轻松访问数据集中的表。导入 (solutionName).(dataSetName)。
  4. 定义新函数。这个示例函数有点简化,但我想这足以让你明白了。

Partial Class (tableName)TableAdapter Public Overloads Function Fill(_table As (tableName), _ schemaName As String) As Integer

Dim args() As String = {schemaName, table.TableName}
Dim selectCmdText As String = "SELECT * FROM {0}.{1}"
selectCmdText = String.Format(selectCmdText, args)

Connection.Open()
Dim selectCmd As New MySqlCommand(selectCmdText, Connection)    
Dim adapter As New MySqlDataAdapter(selectCmd)

Dim returnValue As Integer = 0
returnValue = adapter.Fill(table)

Connection.Close()

Return returnValue

结束函数结束类

亲切的问候,卡洛斯·马伦

于 2011-06-23T01:49:57.217 回答