Я обращаюсь к БД, используя общий DbConnection, предоставленный DbProviderFactories, и я заметил, что мне не нужно вызывать Open перед использованием соединения. Я предоставляю пример кода, который работает (используя «System.Data.SqlClient» или «Oracle.DataAccess.Client» в качестве параметра providerInvariantName). Я выполнил все операции CRUD с похожим кодом без явного вызова Open в соединении без заметной ошибки.Использование DbConnection без его открытия сначала
Я понимаю, что мне не нужно его закрывать, так как оператор using заботится о закрытии и удалении соединения. Но когда соединение открыто в этом коде, то? Открывается ли он автоматически, когда я вызываю Fill на соответствующем DataAdapter? Есть ли какие-либо последствия неявным вызовом Open на объекте соединения перед его использованием? Потому что, если это ненужно, и я могу сэкономить пару строк кода, я обязательно это сделаю. ;-)
DbProviderFactory myFactoryProvider = DbProviderFactories.GetFactory("System.Data.SqlClient");// same with "Oracle.DataAccess.Client"
using (var myConnection = myFactoryProvider.CreateConnection())
using (var myCommand = myFactoryProvider.CreateCommand())
{
try
{
// Set up the connection
myConnection.ConnectionString = _someConnectionString;
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT * FROM SOME_TABLE";
// Create DataAdapter and fill DataTable
DbDataAdapter dataAdapter = myFactoryProvider.CreateDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataTable myTable = new DataTable();
dataAdapter.Fill(myTable);
// Read the table and do something with the data
foreach (DataRow fila in myTable.Rows)
{
// Do something
}
}
catch (Exception e)
{
string message = e.ToString();
throw;
}
} //using closes and disposes the connection and the command
ли «должно быть» означает, что это ? – Rodrigo
соединение открывается при запуске метода Fill. Отключенные объекты ADO.NET, такие как DataAdapter, работают следующим образом: при запуске метода Fill сначала открывается соединение с db, затем другой отключенный объект в качестве DataTable, который работает как контейнер, заполняется, а затем соединение закрывается. –