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:无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?)
第 90 行:return reader["col_1"];

我确定我犯了一个非常明显的错误,但我似乎找不到任何单行示例,我找到的所有示例都是针对使用while loop.

4

10 回答 10

26

reader["col_1"]返回object

你想要类似的东西reader.GetString(reader.GetOrdinal("col_1"))

编辑-> 我只是想在此处添加一条注释,除了其他人提出的担忧之外,SELECT TOP没有 anORDER 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

问题是返回类型。您所在的方法期望您返回一个字符串,但reader["col_1"]它是一个对象。我建议返回reader["col_1"].ToString()Convert.ToString(reader["col_1"])

于 2012-07-09T15:16:06.157 回答
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 回答
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语句

[...]
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,这是错误的来源,它不能隐式转换object为 a string

您可能希望从 col_1 返回一个字符串,因此您可以强制转换它:(string)reader["col_1"].

于 2012-07-09T15:17:54.223 回答
2

首先你可以使用 cast (string)reader["col_1"]。您可能期待一个字符串并且reader["col_1"]是一个object.

于 2012-07-09T15:15:45.227 回答
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

按照以下步骤选择单个列并显示它们。

    //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(); 
于 2019-06-04T10:08:28.817 回答