Поля хранимой процедуры asp.net Ado

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

Select I.ID,
           I.Name,
           I.NameUrl,
           I.Teaser,
           I.Description,
           I.Coords,
           I.Banned,
           I.DateAdded,
           I.TypeID,
           I.MainCategoryID,
           C.Name,
           C.NameUrl,
           C.Description
from Items I
inner join Categories C on C.ID=I.MainCategoryID

Некоторые столбцы в нескольких таблицах имеют одинаковые имена.

Приведенный ниже код ADO asp.net не работает для этих одинаковых имен, которые я использую.

Мой вопрос: Должен ли я указать имя в запросе sql для полей C.Name, C.NameUrl и C.Description, чтобы получить его из таблицы данных, указанной ниже? Я имею в виду, что я хотел бы избежать размещения (в каждой хранимой процедуре) «C.Name as CategoryName», «C.ID as CategoryID» и т. д. Знаете ли вы решение?

item.Name = Convert.ToString(dt.Rows[0]["Name"]);
item.NameUrl = Convert.ToString(dt.Rows[0]["NameUrl"]);
item.Teaser = Convert.ToString(dt.Rows[0]["Teaser"]);
item.Description = Convert.ToString(dt.Rows[0]["Description"]);
item.DateAdded = Convert.ToDateTime(dt.Rows[0]["DateAdded"]);
item.IsBanned = Convert.ToBoolean(dt.Rows[0]["Banned"]);
item.MainCategory = new Category();
item.MainCategory.ID = Convert.ToInt32(dt.Rows[0]["MainCategoryID"]);
item.MainCategory.Name = Convert.ToString(dt.Rows[0]["C.Name"]);
item.MainCategory.NameUrl= Convert.ToString(dt.Rows[0]["C.NameUrl"]);

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

С уважением.

Хосе


person Jose3d    schedule 13.06.2011    source источник


Ответы (5)


Вы можете использовать имя столбца из набора результатов без квалификатора.

Однако у вас есть неоднозначные имена столбцов. Итак, вам нужно дать им псевдоним:

Select I.ID,
           I.Name AS ItemName,
           I.NameUrl AS ItemNameUrl,
           I.Teaser,
           I.Description AS ItemNDescription,
           I.Coords,
           I.Banned,
           I.DateAdded,
           I.TypeID,
           I.MainCategoryID,
           C.Name AS CategoryName,
           C.NameUrl AS CategoryNameUrl,
           C.Description AS CategoryDescription
from Items I
inner join Categories C on C.ID=I.MainCategoryID

и

item.Name = Convert.ToString(dt.Rows[0]["ItemName"]);
item.NameUrl = Convert.ToString(dt.Rows[0]["ItemNameUrl"]);
item.Teaser = Convert.ToString(dt.Rows[0]["Teaser"]);
item.Description = Convert.ToString(dt.Rows[0]["ItemDescription"]);
item.DateAdded = Convert.ToDateTime(dt.Rows[0]["DateAdded"]);
item.IsBanned = Convert.ToBoolean(dt.Rows[0]["Banned"]);
item.MainCategory = new Category();
item.MainCategory.ID = Convert.ToInt32(dt.Rows[0]["MainCategoryID"]);
item.MainCategory.Name = Convert.ToString(dt.Rows[0]["C.CategoryName"]);
item.MainCategory.NameUrl= Convert.ToString(dt.Rows[0]["C.CategoryNameUrl"]);
item.MainCategory.Description= Convert.ToString(dt.Rows[0]["C.CategoryDescription"]);
...
person gbn    schedule 13.06.2011

Решением будет рефакторинг вашей базы данных, чтобы использовать правильные имена столбцов. Без рефакторинга базы данных вам придется реорганизовать хранимые процедуры, чтобы правильно идентифицировать столбцы.

В любом случае, вам предстоит довольно много печатать.

person Duncan Howe    schedule 13.06.2011

Будет лучше, если вы сделаете алиасинг, иначе всегда будет проблема

Select I.ID,
       I.Name as IName,
       I.NameUrl,
       I.Teaser,
       I.Description as Idescription,
       I.Coords,
       I.Banned,
       I.DateAdded,
       I.TypeID,
       I.MainCategoryID,
       C.Name as CName,
       C.NameUrl,
       C.Description as Cdescription from Items I
 inner join Categories C on C.ID=I.MainCategoryID
person Deepesh    schedule 13.06.2011

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

 Select I.ID,
I.Name as itemname,
I.NameUrl as itemurl,
I.Teaser,
I.Description as itemdesc,
I.Coords,
I.Banned,
I.DateAdded,
I.TypeID,
I.MainCategoryID,
C.Name as catname,
C.NameUrl as caturl,
C.Description as catdesc 
from Items I inner join Categories C on C.ID=I.MainCategoryI
person Rahul    schedule 13.06.2011

Как уже говорили некоторые другие, вам нужно будет использовать псевдонимы имен в вашей хранимой процедуре, и они дали вам примеры того, как это сделать. Кроме того, вы можете ВЫБРАТЬ В временную таблицу и назвать их так, как хотите, а затем получить код из временной таблицы без каких-либо псевдонимов, необходимых на стороне кода. Тем не менее, нет необходимости использовать псевдоним для хранимой процедуры. Удачи!

person CSSHell    schedule 15.06.2011