C# 返回一行

C# 返回一行,c#,ado.net,asp.net-3.5,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 =

我试图从数据库返回一行:

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

您需要类似于
reader.GetString(reader.GetOrdinal(“col_1”))


编辑->我只是想在这里添加一个注意事项,除了其他人提出的问题外,没有排序依据的
选择TOP
可以根据模式更改和/或旋转木马扫描给您随机结果。

首先,您可以使用cast
(string)reader[“col_1”]
。您可能需要一个字符串,而
读取器[“col_1”]
是一个
对象

而不是:

 using (reader = command.ExecuteReader())
 {
      reader.Read();
      return reader["col_1"];
 }
您需要将
读卡器[“col_1”]
强制转换为字符串,或者
读卡器[“col_1”].ToString()
或者
读卡器.GetString(0)
如下:

return reader.GetString(0);

如果查询只返回一个值,则可以使用
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”]
是一个对象。我建议返回
reader[“col_1”].ToString()
Convert.ToString(reader[“col_1”])
reader[“col_1”]
返回一个
对象。我假设函数的返回类型为
string
,这就是错误的来源,它不能隐式地将
对象
转换为
字符串


您可能希望从col_1返回一个字符串,这样您就可以强制转换它:
(string)reader[“col_1”]

对我来说,您似乎不需要一行,只需要一个值:

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

读取器返回您应该将其转换为所需的对象,在本例中为字符串

您可以使用以下任一代码:

returnreader.GetString(0)

返回读取器[“col_1”].ToString()

返回Convert.ToString(读卡器[“col_1]”)

将读取器[“col_1”]作为字符串返回

但在离开函数之前,不要忘记关闭连接和读卡器

string ret = reader.GetString(0);
reader.Close();
connection.Close();
return ret;
这就是我如何设计(和修复)代码的方式:

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[]
将为您提供
对象
类型,这些类型需要强制转换。然而,我几乎不喜欢这种风格,我总是喜欢稍微详细一点,但更健壮地使用序数,并以强类型的方式请求类型

如果只需要第一行第一列中的值,可以使用
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;
}

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

    //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(); 

这将返回
col_2
的值,而不是
col_1
。实际上,
col_1
是第一列,但列索引是以零为基础的,因此您应该使用
reader.GetString(0)
要将
列1
作为字符串获取…我不同意调用
ToString
,因为即使数据库类型发生更改,这仍将继续工作。在我看来,如果这改变了
string
,我希望得到一个错误告诉我同样的情况。如果它真的是一个字符串,将其转换为
(string)reader[“”]
,或者更好,请求它
reader.GetString(0)
。请注意,我以前写过
var x=…
,所以我用
ToString()
指定类型,但是是的,
reader.GetString(0)
更好。我并不是说代码中的类型不正确,我是说它会隐藏数据库中的值不再是字符串这一事实的问题,因为
。ToString
将成功地将
null
以外的任何内容转换为字符串。我明白了,但自从您提到以来,我已经添加了对
DBNull
的检查,并且我支持使用内置函数。这就是我改变的原因。顺便说一句,你返回的是一个单元格,而不是一行!如果这是您想要的,那么查看一下
command.ExecuteScalar()
@banging,听起来很不错。但是,是否可以使用ExecuteScalar返回单个字符串而不是整数?
ExecuteScalar()
返回一个对象,因此您必须像so
(string)命令那样对其进行适当的强制转换。ExecuteScalar()
我不同意调用ToString,因为即使基础类型发生更改,它也会继续工作。在我看来,如果这改变远离字符串,我希望得到一个错误告诉我这么多。如果它真的是一个字符串,请将其转换为
(string)reader[“”]
,或者更好的方法是,请求它为
reader.GetString(0)
。这对空值不起作用。使用
Convert.ToString(reader[“col_1”])
代替..谢谢@banging,我已经添加了它。他使用
拥有
中的所有内容,所以他不需要显式关闭任何内容!