问题
I'm trying to return a single row from a database:
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"];
}
}
}
But I'm getting the following error message:
Compiler Error Message: CS0266: Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)
Line 90: return reader["col_1"];
I'm sure I am making a really obvious mistake, but I can't seem to find any single row examples, all I examples I find are for multiple returned rows using a while loop
.
回答1:
reader["col_1"]
returns object
.
You want something like reader.GetString(reader.GetOrdinal("col_1"))
.
Edit -> I just wanted to add a note here that, in addition to the concerns others have raised, a SELECT TOP
without an ORDER BY
can give you random results based on schema changes and/or merry-go-round scans.
回答2:
This is how I would style (and fix) the code:
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;
}
}
Using the index reader[]
will give you object
types, these need casting. However, I hardly touch that style and always favour the slightly more verbose, but more robust use of ordinals and asking for types in a strongly-typed manner.
If you only need the value in the first column of the first row, you can use ExecuteScalar
instead, again this returns an object that can be cast and doesn't need a reader:
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;
}
回答3:
The problem is the return type. The method you are in is expecting you to return a string, but reader["col_1"]
is an object. I suggest returning reader["col_1"].ToString()
or Convert.ToString(reader["col_1"])
.
回答4:
To me it seems, you don't want a single row, only a single value:
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
回答5:
Instead of:
using (reader = command.ExecuteReader())
{
reader.Read();
return reader["col_1"];
}
You need to cast the reader["col_1"]
to string, either reader["col_1"].ToString()
or reader.GetString(0)
like:
return reader.GetString(0);
回答6:
reader["col_1"]
returns an object
. I assume your function has a return type of string
, which is where the error is coming from, it cannot implicitly convert the object
to a string
.
You probably expect a string returned from col_1 so you can just cast it: (string)reader["col_1"]
.
回答7:
You can use an if
statement if your query only returns one value
[...]
string x = string.Empty;
if(reader.Read()) {
// make sure the value is not DBNull
if(DBNull.Value != reader["col_1"]) {
x = reader.GetString(0);
}
}
[...]
回答8:
First of all you can use the cast (string)reader["col_1"]
. You are probably expecting a string and reader["col_1"]
is an object
.
回答9:
the reader returns object which you should cast it to what you need, in this case a string.
you can use any of this codes :
return reader.GetString(0);
return reader["col_1"].ToString();
return Convert.ToString(reader["col_1"]);
return reader["col_1"] as string;
but dont forget to close the connection and reader before leaving the function.
string ret = reader.GetString(0);
reader.Close();
connection.Close();
return ret;
回答10:
Follow the following steps to select a single colume, and display them.
//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();
来源:https://stackoverflow.com/questions/11397946/returning-a-single-row