Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2012, 17:15   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию SqlDataAdapter close или нет ?

Добрый день товарищи ! возник такой вопрос. вот обычное подключение к базе и чтение и заполнение datagrid (из книги взят)
Код:
SqlConnection conn = new SqlConnection();
	conn.ConnectionString = connectionString;
	SqlCommand myCommand = new SqlCommand();
	myCommand.Connection = conn;
	myCommand.CommandText = commandText;
	SqlDataAdapter dataAdapter = new SqlDataAdapter();
	dataAdapter.SelectCommand = myCommand;
	DataSet ds = new DataSet();
	conn.Open();
	dataAdapter.Fill(ds, "Customers");
	dataGrid1.DataSource = ds.Tables["Customers"].DefaultView;
	conn.Close();
тут все понятно создается подключение открывается заполняется и т.д. ну и закрывается в конце.
посмотрел в MSDN'е можно сделать через SqldataAdapter http://msdn.microsoft.com/ru-ru/library/w2d3kh8d.aspx ну сделал так, получилось
Код:
            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(queryString, connectionString))
            {
                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);}
собственно Microsoft пишет
Цитата:
SqlDataAdapter создаст и будет поддерживать подключение, созданное с параметром selectConnectionString.
НО как его потом закрыть ? и надо ли вообще его закрывать ? лопатил нет случайно наткнулся на 1 пост в котором писали
Цитата:
При работе с dataAdapter не обязательно открывать и закрывать Connection
хотелось бы знать так ли это ? а то запросов будет много, честно говоря я побаиваюсь утечек памяти.
wm_leviathan вне форума Ответить с цитированием
Старый 28.05.2012, 17:58   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

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

как то так должно выглядеть
Код:
using (var c= new SqlConnection(Properties.Settings.Default.DataConnectionString))
	    {
		c.Open();
		using (var a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c))
		{
		   
		}
	    }
Reskov вне форума Ответить с цитированием
Старый 29.05.2012, 08:57   #3
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

Цитата:
как то так должно выглядеть
Код:
using (var c= new SqlConnection(Properties.Settings.Default.DataConnectionString))
	    {
		c.Open();
		using (var a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c))
		{
		   
		}
	    }
если бы так было, то вопросов бы не возникало. тут понятно где открывается соединение и как\где его закрывать. привиду полный свой код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data;
using System.Windows.Forms;

namespace Esrn
{
    class ClassFind
    {
        public String connectionString = "User Id=sa;password=15091985;Initial Catalog=Esrn;Data Source=Sub-Master";

        #region Поиск по Фамилии, имени, отчеству, дате рождения
        public void FindByFIO(string strSQL)
        {
            string queryString = "select [Osn].Fam,[Osn].Ima,[Osn].Ot,[Osn].Dr,[Adr].Fulladr,[Osn].Kodsoc from [Osn],[Adr]" +
                                "where [Osn].kodind=[Adr].kodind and " + strSQL;
            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(queryString, connectionString))
            {
                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);

                ((frmMain)Application.OpenForms["frmMain"]).bindingSourceMain.DataSource = table;

                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.AutoResizeColumns(
                    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.DataSource = ((frmMain)Application.OpenForms["frmMain"]).bindingSourceMain;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.ReadOnly = true;


                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[0].HeaderText = "Фамилия";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[1].HeaderText = "Имя";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[2].HeaderText = "Отчество";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[3].HeaderText = "Дата рождения";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[4].HeaderText = "Адрес";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[5].HeaderText = "КодСоцПом";
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                ((frmMain)Application.OpenForms["frmMain"]).dataGridMain.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

            }
        }

        #endregion
}
как видно SqlConnection тут нету а соединение открывается непосредственно в SqlDataAdapter. собственно отсюда и вопрос надо ли закрывать SqlDataAdapter, даже если не использовать using ?
wm_leviathan вне форума Ответить с цитированием
Старый 29.05.2012, 11:52   #4
Kazbek17
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 12
По умолчанию

Для чего вы используете наследования класса using >> using (SqlDataAdapter dataAdapter = new SqlDataAdapter(queryString, connectionString))
если вы используете ссылку new?
И соедениение с бд у вас идет через SqlDataAdapter,
Создаейте Sqliconnection conn = new Sqliconnection(@"my.db") и не мучайтесь, а закрывать бд нужно, иначе могут не сохраниться данные.

Код:
public partial class Form1 : Form
    {
        
        public SQLiteConnection sql_connect;
        public SQLiteCommand sql_command;
        public SQLiteDataAdapter sql_dataAdapter;
        public DataSet Ds = new DataSet();
        public DataTable DT = new DataTable();
        public  Form1 ()
        {
            InitializeComponent();
        }


public void SetConnection()
        {
            sql_connect = new SQLiteConnection("Data        Source=Ваша_База.db;Version=3;New=False;Compress=True;");
        }//Путь к файлу Базы Данных
        public void ExecuteQuery(string text)
        {
            SetConnection();//Соединение с базой данных
            sql_connect.Open();//Открывает соединение с БД
            sql_command = sql_connect.CreateCommand();//Выполняет команду
            string CommandText = Select * From Имя таблицы;
            sql_dataAdapter = new SQLiteDataAdapter(CommandText, sql_connect);
            Ds.Reset();
            sql_dataAdapter.Fill(Ds);
            DT = Ds.Tables[0];
            DGV_Лимитка.DataSource = DT;
            DGV_Лимитка.Columns[0].HeaderText = "Имя столбца";
            DGV_Лимитка.Columns[1].HeaderText = "Имя столбца";
            DGV_Лимитка.Columns[2].HeaderText = "Имя столбца";
            DGV_Лимитка.Columns[3].HeaderText = "Имя столбца";
            DGV_Лимитка.Columns[7].HeaderText = "Имя столбца";
            sql_connect.Close();//закрывает соединение с БД
        }

Последний раз редактировалось Kazbek17; 29.05.2012 в 12:04.
Kazbek17 вне форума Ответить с цитированием
Старый 29.05.2012, 12:31   #5
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Цитата:
если бы так было, то вопросов бы не возникало.
а что вам мешает писать так?



помоему SqlDataAdapter при конструкторе string, string открывает соедение на каждую транзакцию и автоматически закрывает его по ее завершению... поэтому ничего закрывать и не надо... посмотрите скл профайлером тогда будете знать наверняка!
Reskov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Application.Terminate или Close? Alexei91 Общие вопросы Delphi 10 22.09.2010 03:50
Правильно или нет вот в чём вопрос но ошибок нет... Alexcool Помощь студентам 2 10.01.2010 13:55
Не добавляется SqlDataAdapter на форму xOKkei Общие вопросы .NET 1 24.02.2009 17:01
метод Close для ADODataSet вызывает ошибку 'BOF или EOF имеет ...' (mdac 6.0) jane БД в Delphi 1 16.07.2008 07:34