1
string query = 
    "SELECT * FROM table1, table2 WHERE table1.Id = table2.fId";
...
using(IDataReader dataReader = 
    db.ExecuteReader(CommandType.Text, query))
..
string value = dataReader["table2.field"]; //dies

我目前正在编写一些 .NET 代码,其中涉及执行连接查询,然后使用 DataReader 访问返回的数据。我想知道是否可以使用某种前缀表示法(参见上面的示例)从返回的行中访问字段,而不必使用序数位置来访问行中的值(在两个表都包含重叠字段的情况下)名字)?

4

5 回答 5

7

既然你提前知道了字段名称,为什么不在 select 语句中表达出来呢?

string query = "SELECT table2.field as field2, ... FROM table1, table2 " + 
               "WHERE table1.Id = table2.fId";

那你可以参考一下dataReader["field2"]

于 2009-06-02T16:49:31.020 回答
3

您永远不应该将 select * 查询发送到生产服务器,因为它会浪费资源。当您加入时,至少有一个字段重复,完全没有必要同时发送。如果您实际上并不需要每一列,则不应返回所有列。此外,当数据库结构发生变化时,您将使用 select * 来中断代码。这确实是个坏主意。

您还应该真正学习使用 ANSII 92 连接语法。您使用的语法仅过时 18 年,并且可能会导致很多问题,因为当人们忘记 where 子句中的连接条件之一时,它过于频繁地导致交叉连接(使用 ANSII 92 连接语法,这不会通过语法检查)。在 SQL Server 中使用旧式左连接语法 (*=) 时,它也并不总是给出正确的答案,因为它有时但并非始终将其解释为交叉连接(并且该样式左连接已被弃用并且不允许在下一个版本中)。我不知道您使用的是什么数据库,但如果您有 SQL Server 后端,则需要注意这一点。

于 2009-06-02T17:11:02.600 回答
1

Using * instead of a fieldlist is the number 1 sql anti-pattern as determined by stack overflow voters.

What are the most common SQL anti-patterns?

于 2009-06-02T17:30:05.257 回答
0

无论列的来源如何,选择的结果都是单个表。您可以看到,当表格有一个共同的列时,它往往会抱怨。:) 如果您上面列出的表具有唯一的列,那么您只需拥有 ["field"]。

于 2009-06-02T16:49:58.083 回答
0

有一些合法的情况,也许你得到了一个数据阅读器或一个存储过程,而你不一定能控制源——例如,在工具或实用程序库中。

虽然总的来说我建议不要使用 *,而是使用别名

您可以通过使用DataReader.GetSchemaTable并查看 BaseTableName 来获得所需的内容。

您还需要使用 ExecuteReader(System.Data.CommandBehavior.KeyInfo) 调用 ExecuteReader。

于 2009-06-02T17:34:26.547 回答