我正在尝试从数据库返回一行:
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
的多个返回行。
答案 0 :(得分:23)
reader["col_1"]
返回object
。
你需要像reader.GetString(reader.GetOrdinal("col_1"))
这样的东西。
编辑 - >我只想在此处添加一条注释,除了其他人提出的问题之外,SELECT TOP
没有ORDER BY
可以根据架构更改和/或旋转木马扫描给出随机结果
答案 1 :(得分:8)
这就是我设计(和修复)代码的方式:
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;
}
答案 2 :(得分:4)
问题是返回类型。您所在的方法是希望您返回一个字符串,但reader["col_1"]
是一个对象。我建议您返回reader["col_1"].ToString()
或Convert.ToString(reader["col_1"])
。
答案 3 :(得分:4)
对我而言,您似乎不需要单行,只需要一个值:
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 :(得分:3)
而不是:
using (reader = command.ExecuteReader())
{
reader.Read();
return reader["col_1"];
}
您需要将reader["col_1"]
转换为字符串,reader["col_1"].ToString()
或reader.GetString(0)
,如:
return reader.GetString(0);
答案 5 :(得分:2)
如果您的查询只返回一个值
,则可以使用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);
}
}
[...]
答案 6 :(得分:2)
reader["col_1"]
会返回object
。我假设您的函数的返回类型为string
,这是错误的来源,它不能隐式地将object
转换为string
。
你可能希望从col_1返回一个字符串,这样你就可以投射它:(string)reader["col_1"]
。
答案 7 :(得分:1)
首先,你可以使用演员(string)reader["col_1"]
。您可能希望使用字符串,reader["col_1"]
是object
。
答案 8 :(得分: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;
答案 9 :(得分:0)
请按照以下步骤选择一个单独的枚举并显示它们。
//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();