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访问返回的数据。我想知道是否可以使用某种前缀表示法访问返回行中的字段(参见上面的示例),而不必使用序号位置来访问行中的值(在两个表都包含重叠字段的情况下)名称)?
答案 0 :(得分:7)
鉴于您提前知道字段名称,为什么不在select语句中表达它们?
string query = "SELECT table2.field as field2, ... FROM table1, table2 " +
"WHERE table1.Id = table2.fId";
然后你可以参考dataReader["field2"]
。
答案 1 :(得分:3)
您不应该将select *查询发送到生产服务器,因为它会浪费资源。当您有一个连接时,至少会重复一个字段,完全没有必要发送两个字段。如果你实际上并不需要每一列,你就不应该返回所有列。此外,当使用select *作为数据库结构更改时,您将打破代码。这真是一个坏主意。
您还应该学会使用ANSII 92连接语法。您使用的语法只有18年过时,并且可能导致大量的问题,因为当人们忘记where子句中的一个连接条件时,它经常导致交叉连接(使用ANSII 92连接语法,这将不会通过语法检查)。在SQL Server中使用旧样式左连接语法(* =)时,它也不总是给出正确答案,因为它有时但不一致会将其解释为交叉连接(并且该样式左连接已被弃用且不允许在下一个版本中)。我不知道您使用的数据库,但如果您有SQL Server后端,则需要注意这一点。
答案 2 :(得分:1)
使用*而不是字段列表是由堆栈溢出选民决定的数字1 sql反模式。
答案 3 :(得分:0)
无论列的来源如何,select的结果都是单个表。你可以看到,当表格有一个共同的列时,它往往会抱怨。 :)如果您上面列出的表具有唯一列,则只需要[“field”]。
答案 4 :(得分:0)
有合法的情况,也许你被交给数据阅读器或存储过程,你不一定控制源 - 例如,在工具或实用程序库中。
虽然一般情况下我建议不要使用*,而是使用别名
您可以使用DataReader.GetSchemaTable并查看BaseTableName来获得所需内容。
您还需要使用ExecuteReader(System.Data.CommandBehavior.KeyInfo)调用ExecuteReader。