2016-06-15 15 views
1

Я обращаюсь к БД, используя общий 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 

ответ

0

Подключение к БД должен быть установлен и открыт, когда оператор

dataAdapter.Fill(myTable); 

работает, так что ваш код будет хорошо как

+0

ли «должно быть» означает, что это ? – Rodrigo

+1

соединение открывается при запуске метода Fill. Отключенные объекты ADO.NET, такие как DataAdapter, работают следующим образом: при запуске метода Fill сначала открывается соединение с db, затем другой отключенный объект в качестве DataTable, который работает как контейнер, заполняется, а затем соединение закрывается. –