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
20.8k66 gold badges76 silver badges101 bronze badges
asked Jul 18, 2009 at 14:04
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 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 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
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
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
12.4k5 gold badges43 silver badges63 bronze badges
answered Apr 23, 2016 at 18:37
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
DevDev
1,45120 silver badges30 bronze badges
XIRURG_ 0 / 0 / 0 Регистрация: 24.12.2017 Сообщений: 80 |
||||
1 |
||||
Недопустимая попытка чтения при отсутствии данных24.05.2019, 19:07. Показов 5352. Ответов 6 Метки нет (Все метки)
Не могу понять почему выбивает эту ошибку:»недопустимая попытка чтения при отсутствии данных»
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 |
|||
так оно и читает селекта на этом моменте
0 |
Igr_ok 784 / 615 / 273 Регистрация: 04.08.2015 Сообщений: 1,707 |
||||
25.05.2019, 11:02 |
4 |
|||
XIRURG_, сори, запутался в вашем коде.
0 |
nedel 1119 / 854 / 499 Регистрация: 09.04.2014 Сообщений: 2,020 |
||||
25.05.2019, 14:12 |
5 |
|||
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 |
|||
Решение
но все равно он не читает из таблицы
обратите венимание на изменение в SendCont и способе исполнения cmd1 Добавлено через 1 минуту
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.
3,2613 золотых знака10 серебряных знаков22 бронзовых знака
задан 16 мая 2020 в 15:01
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