[英]How to access Ambiguous Column in SQL Query with SELECT *
當我執行存儲過程時
SELECT * FROM Users
INNER JOIN BloodBankUser ON Users.UserID = BloodBankUser.UserID
它給我很好的結果。
但現在在.net方面
dt.Rows[0]["Address"].ToString();
這給了我表BloodBankUser的地址
dt.Rows[0]["Users.Address"].ToString();
當我調試此語句時,它執行錯誤
列“ Users.Address”不屬於表。
我如何獲得Users.Address的價值
在輸出中重命名FIELD(選擇FIELDNAME作為NEWNAME)
盡管第一個答案是更改SQL查詢以為每個字段指定一個唯一的名稱,但是仍然可以檢索與您的字段關聯的表名稱。
在此示例中,我沒有使用DataAdapter
填充DataTable
,而是使用SqlDataReader
。
請注意,如果由於某種原因而無法檢索數據庫架構,則此操作可能會失敗
在SqlCommand
上調用ExecuteReader
時,有一個重載,允許您指定CommandBehavior
。 在我們的例子中,我們想要的行為是CommandBehavior.KeyInfo
。
var reader = command.ExecuteReader(CommandBehavior.KeyInfo);
現在,在閱讀器上,您可以調用GetSchemaTable
方法。 它返回一個DataTable
包含您的查詢的結構。
var schema = reader.GetSchemaTable();
您可以在MSDN上了解該表 。
現在,我們的目標是將字段和表格與其在列列表中的順序位置進行匹配。 模式表中的三個字段與您的興趣有關:
然后,您可以創建一個擴展方法以進行以下讀取:
public static T Field<T>(this SqlDataReader reader, DataTable schema, string table, string field)
{
// Search for the ordinal that match the table and field name
var row = schema.AsEnumerable().FirstOrDefault(r => r.Field<string>("BaseTableName") == table && r.Field<string>("ColumnName") == field);
var ordinal = row.Field<int>("ColumnOrdinal");
return (T)reader.GetValue(ordinal);
}
然后可以調用該擴展方法
using (SqlConnection connection = new SqlConnection("your connection string"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("SELECT * FROM Users INNER JOIN BloodBankUser ON Users.UserID = BloodBankUser.UserID;", connection))
using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo))
{
var schema = reader.GetSchemaTable();
while (reader.Read())
{
Console.WriteLine(reader.Field<string>(schema, "Users", "Address"));
}
}
}
您指定列名,而不是使用SELECT * FROM
然后將可以執行以下操作
Select User.Username,
User.Address as 'UserAddress',
BloodBankUser.Address as 'BloodbankAddress'
FROM Users
INNER JOIN BloodBankUser ON Users.UserID = BloodBankUser.UserID
避免在SELECT
查詢中使用*
。 僅選擇您需要的列並明確命名,以免產生歧義,
SELECT *...
Insead指定您要顯式指定的列,並對可能重復的列進行別名
SELECT Users.Address as UsersAddress
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.