ADO.NET ExecuteReader не возвращает результатов

1

Я обновляю старый старый код, и у меня возникла проблема с методом SqlCommand.ExecuteReader(). Проблема в том, что он не возвращает никаких результатов. Однако, используя SqlDataAdapter.Fill(), я возвращаю результаты из базы данных. Что я делаю не так? Как я могу получить результаты с помощью устройства чтения данных?

var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString();

using (var sqlConnection = new SqlConnection(connectionString))
{
    using (var sqlCommand = new SqlCommand())
    {
        sqlCommand.Connection = sqlConnection;
        sqlCommand.CommandType = CommandType.Text;
        sqlCommand.CommandText = "SELECT * FROM MyTable WHERE ID = 1";
        sqlConnection.Open();

        // This code works.
        //var dataTable = new DataTable();
        //using (var sqlDataAdapter = new SqlDataAdapter(sqlCommand))
        //{
        //  sqlDataAdapter.Fill(dataTable);
        //}

        // This code is not working.
        using (var sqlDataReader = sqlCommand.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
                // This fails because the data reader has no results.
                var id = sqlDataReader.GetInt32(0);
            }
        }
    }
}
  • 0
    Вы пробовали sqlDataReader.GetValue(0) ? Это возвращает данные?
  • 1
    Что именно терпит неудачу - что такое сообщение об ошибке?
Показать ещё 3 комментария
Теги:
sql-server
tsql
ado.net

4 ответа

1
Лучший ответ

Может быть, нет Int32 в ваших результатах?

var id = sqlDataReader.GetInt32(0); // <-- this might not be an Int32

Попробуйте:

var id = sqlDataReader.GetValue(0);

Или применить к правильному типу (например, BIGINT - Int64), не уверен, не видя ваши данные.

  • 0
    Столбец в таблице (PK, int, не null), поэтому GetInt32 должен работать. GetValue работает, но я должен привести его к целому числу.
  • 0
    @Halcyon Приведение к int - это не то же самое, что вызов GetInt32() оно не будет работать, если не будет точного совпадения типов, когда приведение короткого к int приемлемо. GetInt32() ли GetInt32() исключение при вызове?
Показать ещё 2 комментария
0

Попробуй это..

var id = 0;

using (var sqlDataReader = sqlCommand.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
                id = sqlDataReader.GetInt32(sqlDataReader.GetOrdinal("ColName"));
            }
        }

Я переместил переменную за пределы кода считывателя, или переменная будет доступна только внутри этой области. Я бы не стал указывать порядковый номер в коде, если кто-то изменил столбцы в БД.

Кроме того, укажите столбцы в инструкции SQL... SELECT ColName FROM... и используйте параметры в запросе

0

Если вы добрались до этой линии, то результаты
Не означает, что значение не равно нулю
И вы не должны использовать SELECT *
Если может возникнуть проблема с неявным литьем
Попробуйте Int32

try
{
    if(sqlDataReader.IsDBNull(0))
    {
       // deal with null
    }
    else  
    {
      Int32 id = sqlDataReader.GetInt32(0);
    }
}
catch (SQLexception Ex) 
{
    Debug.WriteLine(Ex.message);
}
-2
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString();

using (var sqlConnection = new SqlConnection(connectionString))
{
    sqlConnection.Open();
    string sql = "SELECT * FROM MyTable WHERE ID = 1";

    using (var sqlCommand = new SqlCommand(sql, sqlConnection))
    {
        using (var sqlDataReader = sqlCommand.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
                // This fails because the data reader has no results.
                var id = sqlDataReader.GetInt32(0);
            }
        }
    }
}
  • 0
    В чем здесь разница?
  • 0
    открытое соединение передается в SQLCommand, этот код работает на 100%, поэтому, поскольку исходный код не перехватывает никаких исключений, я предполагаю, что первый столбец не является целым числом, в общем случае это плохая практика - делать выбор *
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню