web-dev-qa-db-ja.com

単一の行を返す

私はデータベースから単一の行を返そうとしています:

using (connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
{
    using (command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
    {
        connection.Open();

        using (reader = command.ExecuteReader())
        {
            reader.Read();
            return reader["col_1"];
        }
    }
}

しかし、次のエラーメッセージが表示されます。

コンパイラエラーメッセージ:CS0266:型 'object'を暗黙的に 'string'に変換できません。明示的な変換が存在します(キャストがありませんか?)
90行目:リーダーを返す["col_1"];

私は本当に明らかな間違いを犯していると確信していますが、単一の行の例を見つけることができないようです。私が見つけるすべての例は、while loop

12
oshirowanen

_reader["col_1"]_はobjectを返します。

reader.GetString(reader.GetOrdinal("col_1"))のようなものが必要です。

編集->ここで、他の人が提起した懸念に加えて、_SELECT TOP_なしの_ORDER BY_を使用すると、スキーマの変更やメリーゴーに基づいてランダムな結果が得られるというメモを追加したいと思います-ラウンドスキャン。

23
Matt Whitfield

これは私がコードをスタイルする(そして修正する)方法です:

using (var connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
using (var command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
{
    connection.Open();

    using (var reader = command.ExecuteReader())
    {
        if (reader.Read()) // Don't assume we have any rows.
        {
            int ord = reader.GetOrdinal("col_1");
            return reader.GetString(ord); // Handles nulls and empty strings.
        }

        return null;
    }
}

インデックスの使用reader[]objectタイプを提供します。これらはキャストする必要があります。ただし、私はそのスタイルにはほとんど触れず、常に少し冗長ですが、序数のより堅牢な使用と、強く型付けされた方法での型の要求を優先します。

最初の行の最初の列の値のみが必要な場合は、代わりにExecuteScalarを使用できます。これも、キャストすることができ、リーダーを必要としないオブジェクトを返します。

using (var connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
using (var command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
{
    connection.Open();

    var result = command.ExecuteScalar();
    return result == null ? "" : (string)result;
}
8

私には、単一の行ではなく、単一の値だけが必要なようです。

SqlConnection sqlConnection = new SqlConnection("Your Connection String");
SqlCommand cmd = new SqlCommand();
Object returnValue;

cmd.CommandText = "SELECT TOP 1 col_name FROM Customers";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;

sqlConnection.Open();

returnValue = cmd.ExecuteScalar();

sqlConnection.Close();

return returnValue.ToString(); //Note you have to cast it to your desired data type
4
yan.kun

問題は戻り値の型です。あなたがいるメソッドはあなたが文字列を返すことを期待していますが、_reader["col_1"]_はオブジェクトです。 reader["col_1"].ToString()またはConvert.ToString(reader["col_1"])を返すことをお勧めします。

4
yoozer8

の代わりに:

_ using (reader = command.ExecuteReader())
 {
      reader.Read();
      return reader["col_1"];
 }
_

_reader["col_1"]_をreader["col_1"].ToString()またはreader.GetString(0)のような文字列にキャストする必要があります。

_return reader.GetString(0);
_
3
Mahmoud Gamal

クエリが1つの値のみを返す場合は、ifステートメントを使用できます

[...]
string x = string.Empty;
if(reader.Read()) {
    // make sure the value is not DBNull
    if(DBNull.Value != reader["col_1"]) {
       x = reader.GetString(0);
    }
}
[...]
2
MilkyWayJoe

reader["col_1"]objectを返します。あなたの関数の戻り値の型はstringであると思います。これはエラーの原因であり、objectを暗黙的にstringに変換することはできません。

おそらくcol_1から文字列が返されることを期待しているので、それをキャストできます:(string)reader["col_1"]

2
lc.

リーダーは、必要なオブジェクト(この場合は文字列)にキャストする必要があるオブジェクトを返します。

あなたはこのコードのどれでも使うことができます:

return reader.GetString(0);

return reader["col_1"].ToString();

return Convert.ToString(reader["col_1"]);

return reader["col_1"] as string;

ただし、関数を終了する前に、接続とリーダーを閉じることを忘れないでください。

string ret = reader.GetString(0);
reader.Close();
connection.Close();
return ret;
1
Navid Kianfar

まず、キャスト(string)reader["col_1"]を使用できます。あなたはおそらく文字列を期待していて、reader["col_1"]objectです。

1
misha

次の手順に従って、単一の列を選択して表示します。

    //create a connection
    SqlConnection sqlConnection = new SqlConnection("Your Connection String");
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConnection;

    //open the connection
    sqlConnection.Open();

    //Your command query string
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT TOP 1 col_name FROM Customers";


    //Execute the reader
    SqlDataReader result  = cmd.ExecuteReader();
    result.Read();

    //close the connection
    sqlConnection.Close();

    return result["coiumn_name"].ToString(); 
0
Ogbonna Vitalis