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

Някои от колоните в няколко таблици имат едно и също име.

Кодът на asp.net ADO по-долу не работи за тези равни имена, които използвам.

Въпросът ми е: Трябва ли да дам име в sql заявката на полетата C.Name, C.NameUrl и C.Description, за да го получа от таблицата с данни, посочена по-долу? Искам да кажа, че бих искал да избегна поставянето (във всяка съхранена процедура) на "C.Name като CategoryName", "C.ID като 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