Параметризация схемы в строго типизированном ADO.NET TableAdapter - PullRequest
0 голосов
/ 30 ноября 2009

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

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

SELECT *
FROM testdict.ModuleVariable
WHERE Module = ?

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

Я пробовал:

SELECT *
FROM ?.ModuleVariable
WHERE Module = ?

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

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

Ответы [ 2 ]

1 голос
/ 23 июня 2011

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

  1. Создайте новый файл и назовите его (dataSetName). (What_you_like) .vb.
  2. Сверху поместите Пространство имен (dataSetName) TableAdapters.
  3. Используйте оператор импорта для легкого доступа к таблицам в наборе данных. Импорт (solutionName). (DataSetName).
  4. Определить новую функцию. Эта примерная функция немного упрощена, но я думаю, вам будет достаточно, чтобы понять эту идею.

Частичный класс (tableName) TableAdapter Функция Public Overloads Fill (_ таблица 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

End Function Конечный класс

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

1 голос
/ 25 декабря 2009

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

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

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

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

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

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

Веселись!

...