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,我已经添加了它。他使用拥有中的所有内容,所以他不需要显式关闭任何内容!