Я использую 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)
Если соединение открыто до вызова метода 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());
}
Он не закрывает соединение. Этот пример работает и выводит идентификатор «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 полностью управлять подключением, оно будет закрыто.