Недопустимая ошибка чтения при отсутствии данных

    private void button1_Click(object sender, EventArgs e)
    {
        string name;
        name = textBox5.Text;
        SqlConnection con10 = new SqlConnection("con strn");
        SqlCommand cmd10 = new SqlCommand("select * from sumant where username=@name");
        cmd10.Parameters.AddWithValue("@name",name);
        cmd10.Connection = con10;
        cmd10.Connection.Open();//line 7
        SqlDataReader dr = cmd10.ExecuteReader();
    }

    if ( textBox2.Text == dr[2].ToString())
    {
        //do something;
    }

When I debug until line 7, it is OK, but after that dr throws an exception:

Invalid attempt to read when no data is present.

I don’t understand why I’m getting that exception, since I do have data in the table with username=sumant.

Please tell me whether the ‘if’ statement is correct or not. And how do I fix the error?

TylerH's user avatar

TylerH

20.8k66 gold badges76 silver badges101 bronze badges

asked Jul 18, 2009 at 14:04

knowledgehunter's user avatar

knowledgehunterknowledgehunter

1,3454 gold badges11 silver badges10 bronze badges

You have to call DataReader.Read() to fetch the result:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read()) 
{
    // read data for single/first record here
}

DataReader.Read() returns a bool indicating if there are more blocks of data to read, so if you have more than 1 result, you can do:

while (dr.Read()) 
{
    // read data for each record here
}

answered Jul 18, 2009 at 14:08

Julien Poulin's user avatar

Julien PoulinJulien Poulin

12.7k10 gold badges51 silver badges76 bronze badges

2

You have to call dr.Read() before attempting to read any data. That method will return false if there is nothing to read.

answered Jul 18, 2009 at 14:08

Colin Mackay's user avatar

Colin MackayColin Mackay

18.7k7 gold badges62 silver badges88 bronze badges

I just had this error, I was calling dr.NextResult() instead of dr.Read().

answered Apr 27, 2014 at 2:38

Charlie's user avatar

0

I would check to see if the SqlDataReader has rows returned first:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}

answered May 27, 2013 at 13:41

dougczar's user avatar

dougczardougczar

5857 silver badges8 bronze badges

1

I used the code below and it worked for me.

String email="";
    SqlDataReader reader=cmd.ExecuteReader();
    if(reader.Read()){
        email=reader["Email"].ToString();
    }

String To=email;

JRodDynamite's user avatar

JRodDynamite

12.4k5 gold badges43 silver badges63 bronze badges

answered Apr 23, 2016 at 18:37

Aneel Goplani's user avatar

I was having 2 values which could contain null values.

while(dr.Read())
 {
    Id = dr["Id"] as int? ?? default(int?);
    Alt =  dr["Alt"].ToString() as string ?? default(string);
    Name = dr["Name"].ToString()
 }

resolved the issue

answered Aug 18, 2016 at 10:41

Dev's user avatar

DevDev

1,45120 silver badges30 bronze badges

XIRURG_

0 / 0 / 0

Регистрация: 24.12.2017

Сообщений: 80

1

Недопустимая попытка чтения при отсутствии данных

24.05.2019, 19:07. Показов 5352. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Не могу понять почему выбивает эту ошибку:»недопустимая попытка чтения при отсутствии данных»

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int ID_contact = -1;
 
                SqlConnection connection = new SqlConnection(connectionString);
                string number = telbox.Text;
                string SendCont = "INSERT INTO contact(Name, Email, Phone_Number) VALUES ('"+namebox.Text+"','"+emailbox.Text+"', ' "+number+ "');";
                               
                string contact = "SELECT ID_contact from contact WHERE Name = '" + namebox.Text + "' and Phone_number = '" + telbox.Text + "' and Email = '" + emailbox.Text + "';";
 
                SqlCommand cmd = new SqlCommand(contact, connection);
                connection.Open();
                MessageBox.Show(contact, "Info");
 
                SqlDataReader dataReader = cmd.ExecuteReader();
 
                try
                {
                    dataReader.Read();
                    ID_contact = Convert.ToInt32(dataReader["ID_contact"]);
                    if (ID_contact<0)
                    {
                        SqlCommand cmd1 = new SqlCommand(SendCont, connection);
                        cmd1.ExecuteNonQuery();
                        dataReader.Read();
                        ID_contact = Convert.ToInt32(dataReader["ID_contact"]);
 
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                connection.Close();



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

24.05.2019, 19:07

6

784 / 615 / 273

Регистрация: 04.08.2015

Сообщений: 1,707

25.05.2019, 08:47

2

XIRURG_, DataReader, как должно быть очевидно из названия, предназначен для чтения данных (SELECT), а не для выполнения INSERT.



0



XIRURG_

0 / 0 / 0

Регистрация: 24.12.2017

Сообщений: 80

25.05.2019, 10:54

 [ТС]

3

так оно и читает селекта на этом моменте

C#
1
2
3
4
5
6
7
 string contact = "SELECT ID_contact from contact WHERE Name = '" + namebox.Text + "' and Phone_number = '" + telbox.Text + "' and Email = '" + emailbox.Text + "';";
 
                SqlCommand cmd = new SqlCommand(contact, connection);
                connection.Open();
                MessageBox.Show(contact, "Info");
 
                SqlDataReader dataReader = cmd.ExecuteReader();



0



Igr_ok

784 / 615 / 273

Регистрация: 04.08.2015

Сообщений: 1,707

25.05.2019, 11:02

4

XIRURG_, сори, запутался в вашем коде.
https://docs.microsoft.com/en-… datareader
Делайте проверку на наличие записей в ридере, как показано в примере.

C#
1
 if (reader.HasRows)



0



nedel

1119 / 854 / 499

Регистрация: 09.04.2014

Сообщений: 2,020

25.05.2019, 14:12

5

C#
1
2
if(dataReader.Read())
   ID_contact = Convert.ToInt32(dataReader["ID_contact"]);



0



0 / 0 / 0

Регистрация: 24.12.2017

Сообщений: 80

25.05.2019, 16:53

 [ТС]

6

сделал по вашему примеру, но все равно он не читает из таблицы



0



nedel

1119 / 854 / 499

Регистрация: 09.04.2014

Сообщений: 2,020

25.05.2019, 19:30

7

Лучший ответ Сообщение было отмечено XIRURG_ как решение

Решение

Цитата
Сообщение от XIRURG_
Посмотреть сообщение

но все равно он не читает из таблицы

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int ID_contact = -1;
 
SqlConnection connection = new SqlConnection(connectionString);
string number = telbox.Text;
string SendCont = "INSERT INTO contact(Name, Email, Phone_Number) VALUES ('"+namebox.Text+"','"+emailbox.Text+"', ' "+number+ "'); select scope_identity()";
               
string contact = "SELECT ID_contact from contact WHERE Name = '" + namebox.Text + "' and Phone_number = '" + telbox.Text + "' and Email = '" + emailbox.Text + "';";
 
SqlCommand cmd = new SqlCommand(contact, connection);
connection.Open();
MessageBox.Show(contact, "Info");
 
SqlDataReader dataReader = cmd.ExecuteReader();
 
try
{
    if(dataReader.Read())
        ID_contact = Convert.ToInt32(dataReader["ID_contact"]);
    if (ID_contact<0)
    {
        SqlCommand cmd1 = new SqlCommand(SendCont, connection);
        object new_id=cmd1.ExecuteScalar();
        ID_contact = Convert.ToInt32(new_id);
     }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
connection.Close();

обратите венимание на изменение в SendCont и способе исполнения cmd1

Добавлено через 1 минуту
а еще почитайте о параметрах в запросах SqlCommand



1



Понимаю что в reader нет данных, но не могу найти ошибку. К БД точно подключен, Название таблицы и имена полей точно правильные. Помогите пожалуйста.

SqlCommand command = new SqlCommand ("SELECT * FROM [Autorization] WHERE [Логин]='"+Convert.ToString(textBox1.Text)+"'", myConnection);
            SqlDataReader reader = command.ExecuteReader();

        string login = Convert.ToString(reader["Логин"]);
        string password = Convert.ToString(reader["Пароль"]);
        string permission = Convert.ToString(reader["Права"]);

Alex R.'s user avatar

Alex R.

3,2613 золотых знака10 серебряных знаков22 бронзовых знака

задан 16 мая 2020 в 15:01

Dendislam's user avatar

1

SqlDataReader reader = command.ExecuteReader();
if (reader.Read()) {
  ...
}

ответ дан 16 мая 2020 в 15:04

1

System.InvalidOperationException: «Недопустимая попытка чтения при отсутствии данных» — это одно из наиболее распространенных исключений, с которым сталкиваются программисты при работе с базами данных. Это ошибка, которая возникает, когда попытка прочитать данные из таблицы не удалась, потому что нет никаких данных в этой таблице.

Причины возникновения исключения System.InvalidOperationException

1. Попытка чтения данных из пустой таблицы.

2. Попытка обратиться к несуществующей таблице.

3. Ошибка в SQL-запросе, из-за которой не удалось получить данные из таблицы.

4. Попытка получить доступ к данным в таблице до того, как она будет полностью заполнена.

5. Неправильно построенное соединение с базой данных.

Как решить проблему с ошибкой System.InvalidOperationException

1. Проверьте наличие данных в таблице:

if (reader.HasRows)
{
while (reader.Read())
{
//Ваш код
}
}
else
{
Console.WriteLine(«Нет данных.»);
}

В этом случае, если нет данных в таблице, то будет выведено сообщение «Нет данных». Если данные есть, то они будут выведены.

2. Убедитесь, что таблица, к которой вы обращаетесь, существует в базе данных и правильно написан ее путь:

string connectionString = «Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True»;
string sql = «SELECT * FROM MyTable»;
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
//Ваш код
}

В этом случае, вы обращаетесь к базе данных с именем «MyDatabase» и таблицей с именем «MyTable». Убедитесь, что эти имена правильно написаны и что они соответствуют именам в вашей базе данных.

3. Убедитесь, что в SQL-запросе нет ошибок. Если есть, исправьте их:

string connectionString = «Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True»;
string sql = «SELECT * FROM MyTable WHERE FirstName=’Иванов’ AND LastName=’Иван'»;
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
//Ваш код
}

В этом случае, вы запрашиваете данные из таблицы «MyTable», где значение «FirstName» равно «Иванов» и «LastName» равно «Иван». Убедитесь, что все колонки и значения правильно написаны в вашем запросе.

4. Используйте скалярный запрос, чтобы узнать, есть ли данные в таблице:

string connectionString = «Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True»;
string sqlCount = «SELECT COUNT(*) FROM MyTable»;
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sqlCount, connection);
connection.Open();
int count = (int)command.ExecuteScalar();
if (count == 0)
{
Console.WriteLine(«Нет данных.»);
}
else
{
//Ваш код
}
}

В этом случае, вы используете скалярный запрос, чтобы получить количество записей в таблице «MyTable». Если количество равно 0, то нет данных. Если количество больше 0, то данные есть.

5. Проверьте правильность соединения с базой данных:

string connectionString = «Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True»;
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
//Ваш код
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

В этом случае, вы пытаетесь открыть соединение с базой данных с именем «MyDatabase». Если соединение установлено, то код продолжит работать. Если соединение не установлено, то вы получите сообщение об ошибке.

В заключение

Ошибки, связанные с базами данных — нормальное явление в программировании. Чтобы решить проблему с ошибкой System.InvalidOperationException, вам нужно убедиться в правильности всех ваших запросов и проверить наличие данных в таблице. Помните, что понимание ошибки — это первый шаг к ее решению. Используйте эти методы и наслаждайтесь работой с базами данных в своих программах.

Я пытаюсь найти способ выполнить следующую хранимую процедуру с помощью C #.

ALTER PROCEDURE spLoadClients
    @NetworkingChannel nvarchar(50)
AS
    SELECT       
        Client_Groups
    FROM
        ClientTable
    WHERE        
        Networking_Channel = (@NetworkingChannel)

    RETURN

Хранимая процедура верна. Мне просто нужно найти подходящий метод для его выполнения на C #.

Вот что я пробовал:

SqlDataReader reader;
string UpdateCommand = "spLoadClients";

using (SqlConnection sqlConnectionCmdString = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Shawn\Documents\Visual Studio 2010\Projects\Server\database\ClientRegit.mdf;Integrated Security=True;User Instance=True"))
using (SqlCommand sqlCommand = new SqlCommand(UpdateCommand, sqlConnectionCmdString))
{
    sqlCommand.CommandType = CommandType.StoredProcedure;
    sqlCommand.Parameters.Add("@NetworkingChannel", SqlDbType.NVarChar).Value = IntializedNetworks[i];

    sqlConnectionCmdString.Open();

    reader = sqlCommand.ExecuteReader();
    // Data is accessible through the DataReader object here.
    IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here
    sqlConnectionCmdString.Close();
}

Я продолжаю получать ошибку, которая говорит

Недопустимая попытка чтения при отсутствии данных.

Что я делаю не так?

2 ответа

Лучший ответ

При использовании читателя с хранимой процедурой по сравнению с Oledb вы можете использовать этот метод.

var list = (from IDataRecord r in reader
                                       select new
                                       {
                                          FieldName1 = (string)r["Network"],
                                          FieldName2 = (string)r["IPAddress"].ToString(),
                                          FieldName3 = (Int32)r["AsPort"],
                                          FieldName4 = (string)r["ThreadLocks"],
                                          FieldName5 = (string)r["GroupBy"]
                                        }).ToList();

Когда вы используете читатель со строковым запросом sql в качестве ввода или встроенный запрос Oledb, вы можете написать так, чтобы читать и добавлять к объекту.

 while (objReader.Read())
            {

                //Upon reading Clean Data for fresh search
                cboClientGroup.Items.Clear();
                cboOccupation.Items.Clear();
                cboCompany.Items.Clear();
                cboClientID.Items.Clear();

                //Apply Fresh Search
                cboClientGroup.Items.Add(Convert.ToString(
                    objReader["Client_Groups"]));

                cboOccupation.Items.Add(Convert.ToString(
                    objReader["Occupation"]));

                cboCompany.Items.Add(Convert.ToString(
                    objReader["Company"]));

                cboClientID.Items.Add(Convert.ToString(
                    objReader["ClientID"]));
}


0

shawn
19 Ноя 2014 в 20:56

Вам нужно вызвать метод .Read() на вашем SqlDataReader — хотя бы один раз, чтобы вернуть данные.

Кроме того, как и SqlConnection и SqlCommand, SqlDataReader также реализует интерфейс IDisposable и, следовательно, действительно должен быть заключен в блок using.

Так что добавьте это в свой код:

sqlConnectionCmdString.Open();

using (reader = sqlCommand.ExecuteReader())
{
    // iterate over the rows returned by the reader
    while (reader.Read()) 
    {
         // Data is accessible through the DataReader object here.
         IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here
    }

    reader.Close();
}
sqlConnectionCmdString.Close();


0

marc_s
30 Окт 2014 в 09:03

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Недопустимая ошибка проходит уже аунтидификация ark
  • Невосстановимая ошибка базы данных код 4 1sjourn
  • Недопустимая ошибка dmc 5
  • Невозможно форматировать диск ошибка
  • Недописанное слово какая ошибка

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: