C#

Открытое и доступное подключение Connection. Подключение закрыто

работаю в c# в проекте под wpf и с базами данных sql и в моменте когда у меня должна выводиться в форме база данных выходит ошибка в коде c#
(System.InvalidOperationException: "Для ExecuteReader нужно открытое и доступное подключение Connection. Подключение закрыто.")
 using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data.Entity;
using System.Data;

namespace WpfApp1
{
enum RoWState
{
Existed,
New,
Modified,
ModifiedNew,
Deleted
}


public partial class Window7admin : Window
{

db database = new db();

int selectedRow;


public Window7admin()
{
InitializeComponent();
CreateColumns();
RefreshDataGridid(dataGridView1);

}

private void CreateColumns()
{

DataGridTextColumn textColumn1 = new DataGridTextColumn();
textColumn1.Header = "ID";
textColumn1.Binding = new Binding("ID");
dataGridView1.Columns.Add(textColumn1);

DataGridTextColumn textColumn2 = new DataGridTextColumn();
textColumn2.Header = "type_of";
textColumn2.Binding = new Binding("Тип товара");
dataGridView1.Columns.Add(textColumn2);

DataGridTextColumn textColumn3 = new DataGridTextColumn();
textColumn3.Header = "count_of";
textColumn3.Binding = new Binding("Количество");
dataGridView1.Columns.Add(textColumn3);

DataGridTextColumn textColumn4 = new DataGridTextColumn();
textColumn4.Header = "postavka";
textColumn4.Binding = new Binding("поставщик");
dataGridView1.Columns.Add(textColumn4);

DataGridTextColumn textColumn5 = new DataGridTextColumn();
textColumn5.Header = "price";
textColumn5.Binding = new Binding("Цена");
dataGridView1.Columns.Add(textColumn5);

DataGridTextColumn textColumn6 = new DataGridTextColumn();
textColumn6.Header = "IsNew";
textColumn6.Binding = new Binding(String.Empty);
dataGridView1.Columns.Add(textColumn6);

}


private void ReadSingleRow(DataGrid dgw, IDataRecord record)
{
dgw.Items.Add(record.GetInt32(0));
dgw.Items.Add(record.GetString(1));
dgw.Items.Add(record.GetInt32(2));
dgw.Items.Add(record.GetString(3));
dgw.Items.Add(record.GetInt32(4));
dgw.Items.Add(RoWState.ModifiedNew);

}


private void RefreshDataGridid(DataGrid dgw)
{
dgw.Items.Clear();

string queryString = $"select * from price";

SqlCommand command = new SqlCommand(queryString, database.getConnection());

database.getConnection();

// Вот тут ошибка SqlDataReader reader = command.ExecuteReader();

while(reader.Read())
{
ReadSingleRow(dgw, reader);
}
reader.Close();
}
Ошибка "Для ExecuteReader нужно открытое и доступное подключение Connection. Подключение закрыто" указывает на то, что у вас возникла проблема с подключением к базе данных. При выполнении метода command.ExecuteReader() вы получаете эту ошибку, потому что подключение не открыто. Чтобы решить эту проблему, вам нужно открыть подключение перед выполнением запроса.

Вызовите метод Open() у вашего экземпляра SqlConnection, как показано ниже:
 private void RefreshDataGridid(DataGrid dgw)  
{
dgw.Items.Clear();

string queryString = $"select * from price";

SqlCommand command = new SqlCommand(queryString, database.getConnection());
database.getConnection().Open(); // Открываем соединение

SqlDataReader reader = command.ExecuteReader();

while(reader.Read())
{
ReadSingleRow(dgw, reader);
}
reader.Close();
database.getConnection().Close(); // Закрываем соединение
}
Также, убедитесь, что у вас есть правильные параметры подключения к базе данных, и что база данных доступна для вашего приложения.
Денис Муратов
Денис Муратов
41 233
Лучший ответ
Алексей Шишкин это был самый оперативный ответ который я когда либо получал xD
расскажите секрет таких быстрых и к счастью правильных ответ) все заработало, спасибо)
То есть открыть соединение ты не догадался?
Роман Ц
Роман Ц
52 478
Алексей Шишкин это моя первая работа с sql в wpf
погуглив не нашел какого то однозначного ответа
так что как видишь не додумался(
зато теперь все работает но данные выводятся столбцом последним а не строчкой
Ошибка в этой строке
SqlDataReader reader = command.ExecuteReader();

Ошибка возникает из-за того, что объект reader не был объявлен до использования внутри цикла while. Для исправления ошибки нужно добавить объявление объекта reader перед циклом while, например:. SqlDataReader reader = null;
try
{
reader = command.ExecuteReader();
while (reader.Read())
{
ReadSingleRow(dgw, reader);
}
}
finally
{
if (reader != null)
reader.Close();
}

Также, чтобы быть уверенным в том, что соединение с базой данных будет закрыто после использования, лучше всего использовать блок using при создании объекта SqlCommand, как показано ниже:.
using (SqlCommand command = new SqlCommand(queryString, database.getConnection()))
{
// код для выполнения запроса и обработки результата
}
Ерохин Михаил
Ерохин Михаил
7 105

Похожие вопросы