在强类型的ADO.NET TableAdapter中参数化架构

时间:2009-11-30 16:10:52

标签: ado.net dataset strongly-typed-dataset tableadapter

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

我的查询看起来像

SELECT *
FROM testdict.ModuleVariable
WHERE Module = ?

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

我试过了:

SELECT *
FROM ?.ModuleVariable
WHERE Module = ?

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

提前致谢

2 个答案:

答案 0 :(得分:1)

  

首先,您只需添加一个选择查询,就无法在设计时实现这一目标。您无法对架构进行参数化。

然而,有一个解决方案。这就是你如何做到这一点。

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

2。)现在在数据库中创建一个存储过程,其中包含两个参数。一个是表的模式 [?.ModuleVariable],另一个是您的 where子句,或者您可能想要作为标准。您可以根据需要创建此重载。然后,此存储过程将根据参数构造sql查询并在数据库上执行它。这将将结果集返回到调用表适配器

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

4。)现在从代码中你可以创建一个表适配器的实例并调用方法,然后调用你的存储过程,返回你的数据表填入结果

玩得开心!

答案 1 :(得分:1)

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

  1. 创建一个新文件并将其命名(dataSetName)。(whatever_you_like).vb。
  2. 在顶部放置Namespace(dataSetName)TableAdapters。
  3. 使用Import语句可以轻松访问数据集中的表。 Imports(solutionName)。(dataSetName)。
  4. 定义新功能。这个示例函数有点简化,但我想这对你来说已经足够了。
  5. Partial Class(tableName)TableAdapter   公共过载功能填充(_     表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
    

    结束功能 结束班

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