Возврат одной строки

Я пытаюсь вернуть одну строку из базы данных:

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