14

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

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 行目: return reader["col_1"];

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

4

10 に答える 10

26

reader["col_1"]戻りますobject

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

SELECT TOP編集 - >他の人が提起した懸念に加えて、ORDER BYスキーマの変更やメリーゴーランドスキャンに基づいてランダムな結果が得られる可能性があるというメモをここに追加したかっただけです。

于 2012-07-09T15:15:35.487 に答える
12

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

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;
}
于 2012-07-09T15:26:49.700 に答える
5

私には、単一の行ではなく、単一の値のみが必要なようです:

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
于 2012-07-09T15:25:13.333 に答える
5

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

于 2012-07-09T15:16:06.157 に答える
4

それ以外の:

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

次のいずれかのreader["col_1"]文字列にキャストする必要があります。reader["col_1"].ToString()reader.GetString(0)

return reader.GetString(0);
于 2012-07-09T15:16:03.570 に答える
3

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

[...]
string x = string.Empty;
if(reader.Read()) {
    // make sure the value is not DBNull
    if(DBNull.Value != reader["col_1"]) {
       x = reader.GetString(0);
    }
}
[...]
于 2012-07-09T15:16:04.440 に答える
3

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

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

于 2012-07-09T15:17:54.223 に答える
2

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

このコードのいずれかを使用できます:

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;
于 2012-07-09T15:26:02.277 に答える
2

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

于 2012-07-09T15:15:45.227 に答える