Делает DataAdapter. Заливка () закрывает свое соединение, когда Исключение выдается?

Я использую ADO.NET (.NET 1.1) в приложении прежней версии. Я знаю тот DataAdapter. Заливка () открывает и закрывает соединения, если соединение не было открыто вручную, прежде чем это будет дано DataAdapter.

Мой вопрос: это также закрывает соединение, если.Fill () вызывает Исключение? (из-за SQL Server не может быть достигнут, или безотносительно). Это пропускает соединение, или это имеет встроенный Наконец-пункт, чтобы удостовериться, что соединение закрывается.

Пример кода:

Dim cmd As New SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet
cmd.Connection = New SqlConnection(strConnection)
cmd.CommandText = strSQL
da.SelectCommand = cmd
da.Fill(ds)
17
задан motto 18 March 2010 в 19:41
поделиться

2 ответа

Если соединение открыто до вызова метода Fill (), то нет, соединение не будет закрыто DataAdapter.

Однако, если вы не открываете соединение явно, а вместо этого позволяете DataAdapter открывать и закрывать соединение с помощью команды Fill (), соединение будет закрыто в случае ошибки.

Это можно сделать из нескольких источников документации, в том числе из этого: Стратегии доступа к данным с использованием ADO.NET и SQL

Кроме того, это можно продемонстрировать в коде, написав подпрограмму, которая выдает ошибку, а затем проверка состояния соединения.

Этот код из приложения Windows Forms доказывает это. В первом окне сообщения будет написано «Открыть», а во втором - «Закрыто».

              string connString = "";
        private void Form1_Load(object sender, EventArgs e)
        {
            connString = Properties.Settings.Default.EventLoggingConnectionString;
            ExplicitlyOpenConnection();
            LetDataAdapterHandleIt();
        }

        private void ExplicitlyOpenConnection()
        {
            System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString);
            System.Data.DataSet ds = new DataSet();
            System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn);

            cn.Open();
            try
            {
                ad.Fill(ds);
            }
            catch (Exception ex)
            {

            }

            MessageBox.Show(cn.State.ToString());
            cn.Close();
        }
        private void LetDataAdapterHandleIt()
        {
            System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString);
            System.Data.DataSet ds = new DataSet();
            System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn);

            try
            {
                ad.Fill(ds);
            }
            catch (Exception ex)
            {

            }
            MessageBox.Show(cn.State.ToString());
        }
21
ответ дан 30 November 2019 в 13:34
поделиться

Он не закрывает соединение. Этот пример работает и выводит идентификатор «ARealTable»

            using (SqlConnection conn = new SqlConnection("Data Source=server;Initial Catalog=database;user id=sa; password=password;"))
            {
                conn.Open();

                try
                {
                    SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM NotATable", conn); 
                    /* Exception thrown next */
                    adap.Fill(new DataSet("test"));
                }
                catch (Exception) { }

                using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 Id FROM ARealTable", conn))
                {
                    string result = Convert.ToString(cmd.ExecuteScalar());
                    Console.WriteLine(result);
                }
                Console.ReadKey();

Edit:

Если вы откроете соединение заранее (вызывая Open для объекта IDbConnection), IDataAdapter не закроет его. Однако, если вы разрешите IDataAdapter полностью управлять подключением, оно будет закрыто.

1
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

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