簡體   English   中英

如何從表中獲取SELECT * FROM TABLE結果到多個變量中

[英]how to get SELECT * FROM TABLE results into more than one variable in c#

我在數據庫中有一個3列的表,並且我有一個SELECT查詢,像這樣:

cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id);

該表具有: gameID, Player1, Player2 我的目的是將表中的玩家名稱(Player1, Player2)轉換為C#中的2個變量,以便我可以使用它們以表格形式顯示。 我嘗試使用cmd.executeScalar()但它只給我一個結果,而不是2。

請問我該怎么做?

首先,一些重要的建議:

  • 不要使用SELECT * 您可能會得到與您想像不同的東西(例如,如果同時更改了數據庫模式)。 而是明確指定您感興趣的每個列。

  • 代替使用字符串連接將SQL查詢粘合在一起,而使用@parameterized查詢。 出於性能(查詢緩存)和安全性(防止SQL注入攻擊)的原因,這是遵循的好原則。

因此,您的代碼變為:

cmd.CommandText = "SELECT Player1, Player2 FROM Game WHERE gameID = @gameId";
cmd.Parameters.AddWithValue("@gameId", game_id);

現在,你的問題:如何獲得的值Player1Player2每個記錄的? 那就是IDataReader的所在。數據讀取器是結果表上的僅向前游標,它使您可以訪問每個返回記錄的值:

// SqlConnection connection = cmd.Connection;
connection.Open();
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
    int player1Index = reader.GetOrdinal("Player1");
    int player2Index = reader.GetOrdinal("Player2");
    while (reader.Read())  // one loop iteration per record returned from SELECT
    {
        string player1 = cmd.GetString(player1Index);
        string player2 = cmd.GetString(player2Index);
        … // do something with player1, and player2
    }        
}

使用ExecuteReader(); 這是一個例子 另外,在這里看看我的問題 ,如何向讀者閱讀

根據ExecuteScalar文檔

執行查詢,並返回查詢返回的結果集中第一行的第一列。 其他列或行將被忽略。

您必須改為使用ExecuteReader 同樣,您的代碼也容易受到SQL注入的攻擊。

考慮使用類似這樣的東西:

using (SqlConnection cnn = new SqlConnection(cnnString))
{
    cnn.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Game WHERE gameID = @gameID", cnn))
    {
        cmd.Parameters.AddWithValue("@gameID", game_id);
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            var player1 = rdr.GetString(1);
            var player2 = rdr.GetString(2);
        }
    }
}

通過使用這樣的塊,您可以獲得三件事:

  1. 訪問所需的字段。
  2. 保護免受SQL注入。
  3. 連接到數據庫時,正確處理非托管資源。

使用cmd.ExecuteReader(); 而不是executeScalar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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