私はデータベースから単一の行を返そうとしています:
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
。
_reader["col_1"]
_はobject
を返します。
reader.GetString(reader.GetOrdinal("col_1"))
のようなものが必要です。
編集->ここで、他の人が提起した懸念に加えて、_SELECT TOP
_なしの_ORDER BY
_を使用すると、スキーマの変更やメリーゴーに基づいてランダムな結果が得られるというメモを追加したいと思います-ラウンドスキャン。
これは私がコードをスタイルする(そして修正する)方法です:
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;
}
私には、単一の行ではなく、単一の値だけが必要なようです。
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
問題は戻り値の型です。あなたがいるメソッドはあなたが文字列を返すことを期待していますが、_reader["col_1"]
_はオブジェクトです。 reader["col_1"].ToString()
またはConvert.ToString(reader["col_1"])
を返すことをお勧めします。
の代わりに:
_ using (reader = command.ExecuteReader())
{
reader.Read();
return reader["col_1"];
}
_
_reader["col_1"]
_をreader["col_1"].ToString()
またはreader.GetString(0)
のような文字列にキャストする必要があります。
_return reader.GetString(0);
_
クエリが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);
}
}
[...]
reader["col_1"]
はobject
を返します。あなたの関数の戻り値の型はstring
であると思います。これはエラーの原因であり、object
を暗黙的にstring
に変換することはできません。
おそらくcol_1から文字列が返されることを期待しているので、それをキャストできます:(string)reader["col_1"]
。
リーダーは、必要なオブジェクト(この場合は文字列)にキャストする必要があるオブジェクトを返します。
あなたはこのコードのどれでも使うことができます:
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;
まず、キャスト(string)reader["col_1"]
を使用できます。あなたはおそらく文字列を期待していて、reader["col_1"]
はobject
です。
次の手順に従って、単一の列を選択して表示します。
//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();