c# - Devolviendo una sola fila
ado.net asp.net-3.5 (9)
Estoy tratando de devolver una sola fila de una base de datos:
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"];
}
}
}
Pero recibo el siguiente mensaje de error:
Mensaje de error del compilador: CS0266: No se puede convertir implícitamente el tipo ''objeto'' a ''cadena''. Existe una conversión explícita (¿falta un elenco?)
Línea 90: lector de retorno ["col_1"];
Estoy seguro de que estoy cometiendo un error muy obvio, pero parece que no puedo encontrar ningún ejemplo de fila, todos los ejemplos que encuentro son para varias filas devueltas usando un while loop
.
Antes que nada puedes usar el (string)reader["col_1"]
hechizos (string)reader["col_1"]
. Probablemente estés esperando una cadena y el reader["col_1"]
es un object
.
Así es como me gustaría diseñar (y corregir) el código:
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;
}
}
El uso del reader[]
índices reader[]
le dará tipos de object
, estos deben ser fundidos. Sin embargo, apenas toco ese estilo y siempre estoy a favor del uso un poco más detallado, pero más sólido de los ordinales y preguntando por los tipos de una manera fuertemente tipada.
Si solo necesita el valor en la primera columna de la primera fila, puede usar ExecuteScalar
en ExecuteScalar
lugar, nuevamente esto devuelve un objeto que se puede convertir y no necesita un lector:
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;
}
El problema es el tipo de devolución. El método en el que se encuentra espera que devuelva una cadena, pero el reader["col_1"]
es un objeto. Sugiero regresar el reader["col_1"].ToString()
o Convert.ToString(reader["col_1"])
.
En lugar de:
using (reader = command.ExecuteReader())
{
reader.Read();
return reader["col_1"];
}
Necesita convertir el reader["col_1"]
en una cadena, ya sea reader["col_1"].ToString()
o reader.GetString(0)
como:
return reader.GetString(0);
Para mí, parece que no quieres una sola fila, solo un valor único:
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
Puede usar una instrucción if si su consulta solo devuelve un valor
[...]
string x = string.Empty;
if(reader.Read()) {
// make sure the value is not DBNull
if(DBNull.Value != reader["col_1"]) {
x = reader.GetString(0);
}
}
[...]
el lector devuelve un objeto que debe convertirlo en lo que necesita, en este caso una cadena.
puedes usar cualquiera de estos códigos:
return reader.GetString(0);
return reader["col_1"].ToString();
return Convert.ToString(reader["col_1"]);
return reader["col_1"] as string;
pero no olvide cerrar la conexión y el lector antes de abandonar la función.
string ret = reader.GetString(0);
reader.Close();
connection.Close();
return ret;
reader["col_1"]
devuelve el object
.
Desea algo como reader.GetString(reader.GetOrdinal("col_1"))
.
Editar -> Solo quería agregar una nota aquí que, además de las inquietudes que otros han planteado, un SELECT TOP
sin un ORDER BY
puede darle resultados aleatorios basados en los cambios de esquema y / o los tiros de tiovivo.
reader["col_1"]
devuelve un object
. Supongo que su función tiene un tipo de string
de retorno, que es de donde proviene el error, no puede convertir implícitamente el object
a una string
.
Probablemente esperas que se devuelva una cadena de col_1 para que puedas simplemente lanzarla: (string)reader["col_1"]
.