3

グーグルを何度も試しても答えが見つからないという単純な問題があります。おそらく、この質問を投稿することは、同じ答えを探している次の貧しい魂を助けるでしょう.

個別の ID のコレクションを返すクエリがあります。

SQLCommandこのクエリで を作成し、それを使用ExecuteScalar( )して実行しています。

ExecuteScalar( )オブジェクトを返すように見え、それを List にキャストすることはできません。

これを修正するためのベスト プラクティスは何ですか? また、この問題を修正するにはどうすればよいですか?

4

4 に答える 4

6

execute scalar は、単一のデータを返します。1 行 1 列と考えてください。コレクションを返したい場合は、 を呼び出す必要がありますExecuteReader()。これは を返しますIDataReader。その後、レコードを反復処理してリストを返すことができます。

于 2012-06-19T16:16:45.717 に答える
3

ExecuteScalar :

クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。

SqlDataReaderを使用する必要があります:

SqlCommand command = new SqlCommand(queryString, connection);
IList<int> ints = new List<int>();
using(SqlDataReader reader = command.ExecuteReader()) {
     while (reader.Read())
     {
         ints.add(reader.GetInt32(0)); // provided that first (0-index) column is int which you are looking for
     }
}
于 2012-06-19T16:16:37.493 に答える
2

ExecuteScalar() - 最初の行と最初の列のみを返します....

msdn を確認してください: SqlCommand.ExecuteScalar

結果を得るには、このようなもの、つまりExecuteReaderを使用する必要があります

 using (IDataReader reader = 
        command.ExecuteReader(CommandBehavior.CloseConnection))
 {
      List<int> intlist = ReadList(reader);
 }

リストの作成方法

List<int> ReadList(IDataReader reader)
{
    List<int> list = new List<int>();
    int column = reader.GetOrdinal("MyColumn");

    while (reader.Read())
    {
        //check for the null value and than add 
        if(!SqlReader.IsDBNull(column))
             list.Add(reader.GetInt32(column));
    }

    return list;
}
于 2012-06-19T16:16:24.113 に答える
2

ExecuteScalarメソッドは、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。

アイテムのリストがExecuteReader必要な場合は、リーダーを使用してループし、必要な値を読み取る必要があります

List<int> items=new List<int>();
using (IDataReader reader = db.ExecuteReader(dbCommand))
{
      while (reader.Read())
      {
         items.Add(reader.GetInt32(reader.GetOrdinal("YourColumnName"));
      }
}
于 2012-06-19T16:18:35.353 に答える