Параметризация схемы в ADO.NET TableAdapter со строгой типизацией

Я пытаюсь создать строго типизированный набор данных в ADO.Net, и у меня возникли небольшие проблемы с одним аспектом адаптеров таблиц.

Мой запрос выглядит так

SELECT *
FROM testdict.ModuleVariable
WHERE Module = ?

Моя проблема вращается вокруг части testdict. Мы используем несколько разных схем для доступа к нашим данным (из-за мультиплексированного экземпляра Sybase IQ). Как я могу параметризовать часть схемы этого запроса?

Я пробовал:

SELECT *
FROM ?.ModuleVariable
WHERE Module = ?

но безрезультатно. Мое текущее мышление состоит в том, что мне, возможно, придется унаследовать TableAdapter и параметризовать схему вручную, но я надеюсь, что есть более хорошее решение!

заранее спасибо


person Jeffrey Cameron    schedule 30.11.2009    source источник


Ответы (2)


Прежде всего, вы не сможете добиться этого во время разработки, просто добавив запрос выбора. Вы не можете параметризовать схему.

Однако для этого есть решение. Вот как это сделать.

1.) Перетащите таблицу в конструктор типизированных данных, который создаст таблицу типизированных данных для таблицы и адаптер таблицы для доступа к таблице базы данных. Адаптер таблицы знает схему таблицы данных.

2.) Теперь создайте хранимую процедуру в своей базе данных, которая принимает два аргумента. один - это схема таблицы [? .ModuleVariable], а другой - это ваше предложение where или, возможно, любое другое условие, которое вы можете пожелать в качестве критерия. Вы можете создавать перегрузки по своему желанию. Затем эта хранимая процедура построит запрос sql на основе аргументов и выполнит его в базе данных. Это вернет набор результатов вызывающему адаптеру таблицы.

3.) Из представления дизайна Добавить метод в адаптер таблицы, который будет извлекать результаты из хранимой процедуры. Убедитесь, что схема результатов в точности соответствует схеме связанной таблицы данных.

4. Теперь из кода вы можете создать экземпляр адаптера таблицы и вызвать метод, который, в свою очередь, вызовет вашу хранимую процедуру и вернет вам таблицу данных, заполненную результатами.

Развлекайся!

person this. __curious_geek    schedule 25.12.2009

Вы можете перегрузить или добавить новую функцию в адаптер таблицы, потому что они определены как частичные классы. Эта новая функция будет иметь имя схемы в качестве параметра. Например, Fill (table As (tableName), schemaName As String). Вот как бы я это сделал:

  1. Создайте новый файл и назовите его (dataSetName). (Something_you_like) .vb.
  2. Вверху поместите Namespace (dataSetName) TableAdapters.
  3. Используйте оператор Import, чтобы легко получить доступ к таблицам в наборе данных. Импорт (имя_решения). (Имя_набора данных).
  4. Определите новую функцию. Этот пример функции немного упрощен, но я думаю, вам будет достаточно, чтобы вы поняли идею.

Частичный класс (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

Конечная функция Конечный класс

С уважением, Карлос Маллен

person Carlos Mallen    schedule 23.06.2011