Как заставить DataSet распознавать имена таблиц из хранимой процедуры? - PullRequest
0 голосов
/ 18 января 2011

У меня есть хранимые процедуры, которые возвращают около 5 таблиц, и я возвращаю их примерно так:

select <fields> from Products where ProductId = @ProductId
select <fields> from RelatedProducts where ProductId = @ProductId
select <fields> from MetaData where ProductId = @ProductId

ну, ты понял суть. Теперь в наборе данных, если я сделаю это:

DataSet ProductDs = DAL.RetreiveProductMetadata(someInteger);

ProductName = DataSet.Tables["Products"].Rows[0]["columnName"].ToString();

Это вызывает исключение ... ну, ошибка, говорящая о том, что TableName равно нулю, и после отладки оказывается, что имена таблиц фактически называются "Results1", "Results2" и т. Д.

Я попытался изменить сохраненный процесс на:

select * From products AS Products

без эффекта.

Как получить C # для обнаружения и использования имен таблиц из базы данных?

ps: у меня есть все виды коалессий и случаев в поле, которые не должны представлять проблемы, верно?
Кроме того, пробовал гуглить и стучать головой - ни один не помог.

Ответы [ 3 ]

3 голосов
/ 15 июня 2012

Это на самом деле возможно, вам просто нужно сначала загрузить схему таблицы, которая не содержит никаких данных, но информацию о структуре таблицы, включая имена таблиц:

adapter.FillSchema(dataset, SchemaType.Source);
adapter.Fill(dataset);

Кажется, что это не работает с запросами, содержащимися в базе данных (как вы могли бы использовать в MS Access), но оно выполняет работу для обычной таблицы.

2 голосов
/ 18 января 2011

Вы не можете.Имя таблицы не имеет значения в наборе результатов, потому что запрос может содержать много таблиц.

Вы должны знать , каковы ваши наборы результатов, и не должны получать имена таблиц.

В противном случае,

select 'Products' AS ThisTable, <fields> from Products where ProductId = @ProductId

Или сначала ПРИСОЕДИНЯЙТЕСЬ и отменив выбор позже

Или определите свой файл dataset.xsd и т. Д. И отобразите в соответствии с ним.

1 голос
/ 26 октября 2011

Единственный способ извлечь таблицу по имени из набора данных: если вы называете ее при заполнении из адаптера или вручную называете ее по одной таблице за раз:

adapter.fill(dataset, "nameoftable")

теперь при доступе к ds в будущем вы можете получить доступ по имени; ds.tables("nameoftable").rows и т. Д.

или назовите их позже.

_ds.tables(0).tablename = "nameoftable"
...