返回单行

时间:2012-07-09 15:13:18

标签: c# ado.net asp.net-3.5

我正在尝试从数据库返回一行:

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的多个返回行。

10 个答案:

答案 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();