Возврат одной строки
Я пытаюсь вернуть одну строку из базы данных:
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
.
Ответы
Ответ 1
reader["col_1"]
возвращает object
.
Вам нужно что-то вроде reader.GetString(reader.GetOrdinal("col_1"))
.
Изменить → Мне просто хотелось добавить примечание, что помимо проблем, которые подняли другие, SELECT TOP
без ORDER BY
может дать вам случайные результаты на основе изменений схемы и/или каретки, округлые сканирования.
Ответ 2
Вот как я буду стилизовать (и исправить) код:
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;
}
Ответ 3
Проблема - это тип возвращаемого значения. Метод, в котором вы находитесь, ожидает, что вы вернете строку, но reader["col_1"]
- это объект. Я предлагаю вернуть reader["col_1"].ToString()
или Convert.ToString(reader["col_1"])
.
Ответ 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
Ответ 5
Вместо:
using (reader = command.ExecuteReader())
{
reader.Read();
return reader["col_1"];
}
Вам нужно передать строку reader["col_1"]
в строку, либо reader["col_1"].ToString()
, либо reader.GetString(0)
, например:
return reader.GetString(0);
Ответ 6
Вы можете использовать оператор 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);
}
}
[...]
Ответ 7
reader["col_1"]
возвращает object
. Я предполагаю, что ваша функция имеет тип возврата string
, откуда исходит ошибка, он не может неявно преобразовать object
в string
.
Вероятно, вы ожидаете, что строка будет возвращена из col_1, поэтому вы можете просто ее использовать: (string)reader["col_1"]
.
Ответ 8
Прежде всего, вы можете использовать cast (string)reader["col_1"]
. Вероятно, вы ожидаете строку, а reader["col_1"]
- object
.
Ответ 9
читатель возвращает объект, который вы должны наложить на то, что вам нужно, в этом случае строка.
вы можете использовать любой из этих кодов:
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;
Ответ 10
Выполните следующие шаги, чтобы выбрать один столбец и отобразить их.
//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();