asp.net Ado存储过程字段

本文关键字:字段 存储过程 Ado net asp | 更新日期: 2023-09-27 17:58:56

我在存储过程中有以下选择:

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"]);

提前谢谢。

谨致问候。

Jose

asp.net Ado存储过程字段

您可以在不使用限定符的情况下使用结果集中的列名。

但是,列名不明确。所以你需要给它们取个别名:

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"]);
...

解决方案是重构数据库以使用正确的列名。如果不重构数据库,就必须重构存储过程以正确识别列。

不管怎样,你都需要大量的打字。

如果你做混叠会更好,否则它总是会产生问题

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

可能会为相同的命名列(如)使用别名

 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

正如其他一些人所说,您需要对存储过程中的名称进行别名,他们已经为您提供了如何进行别名的示例。或者,您可以选择一个临时表,并根据自己的意愿命名它们,然后从临时表中提取代码,而不需要在代码端使用任何别名。但是,必须对存储过程进行别名处理是无法避免的。祝你好运