我正在尝试在ADO.Net中构建一个强类型数据集,并且在TableAdapters的一个方面遇到了一些麻烦。
我的查询看起来像
SELECT *
FROM testdict.ModuleVariable
WHERE Module = ?
我的问题围绕着testdict部分。我们使用几种不同的模式来访问我们的数据(因为多路复用的Sybase IQ实例)。如何参数化此查询的架构部分?
我试过了:
SELECT *
FROM ?.ModuleVariable
WHERE Module = ?
但无济于事。我目前的心态是我可能必须继承TableAdapter并手动参数化架构,但我希望有更好的解决方案!
提前致谢
答案 0 :(得分:1)
首先,您只需添加一个选择查询,就无法在设计时实现这一目标。您无法对架构进行参数化。
然而,有一个解决方案。这就是你如何做到这一点。
1。)将表拖放到类型化数据集设计器中,该设计器将为表创建类型化数据表,表适配器访问数据库表。表适配器知道数据表的模式。
2。)现在在数据库中创建一个存储过程,其中包含两个参数。一个是表的模式 [?.ModuleVariable],另一个是您的 where子句,或者您可能想要作为标准。您可以根据需要创建此重载。然后,此存储过程将根据参数构造sql查询并在数据库上执行它。这将将结果集返回到调用表适配器。
3.)从设计视图添加一个方法到表适配器,它将从存储过程中获取结果。 确保结果架构完全符合关联数据表的架构。
4。)现在从代码中你可以创建一个表适配器的实例并调用方法,然后调用你的存储过程,返回你的数据表填入结果
玩得开心!
答案 1 :(得分:1)
您可以重载或向表适配器添加新函数,因为它们被定义为部分类。这个新函数将模式名称作为参数。例如,Fill(table As(tableName),schemaName As String)。我就是这样做的:
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
结束功能 结束班
亲切的问候, 卡洛斯·马伦