簡體   English   中英

如何使用SELECT訪問SQL查詢中的歧義列*

[英]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上了解該表

現在,我們的目標是將字段和表格與其在列列表中的順序位置進行匹配。 模式表中的三個字段與您的興趣有關:

  • 列名
  • BaseTableName
  • 列序號

然后,您可以創建一個擴展方法以進行以下讀取:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM