2014-09-19 9 views
2

Normaly Я бы использовал либо «Использование», либо просто connection.open() и connection.close(). Но когда я звоню в хранимую процедуру, это не нужно. Как так? (Да, код, приведенный ниже, работает без использования или открытия).Connection.Open() необходимо при вызове хранимой процедуры?

try { 
    SqlCommand cmd = new SqlCommand("***", connectionSiteDb); 
    DataTable dt = new DataTable(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@ProcessSegmentID", ProcessSSegmentID)); 
    cmd.Parameters.Add(new SqlParameter("@PO_RecipeID", PO_RecipeID)); 
    cmd.Parameters.Add(new SqlParameter("@ProductSegmentVersion", ProductSegmentVersion)); 


    SqlDataAdapter da = new SqlDataAdapter(); 
    da.SelectCommand = cmd; 
    da.Fill(dt); 
    return dt; 
} 
catch (Exception e) { 
    Console.WriteLine(e); 
    return null; 
} 
+1

Вы проверили свойство связи? Состояние соединения закрыто? –

+0

перед процедурой вызова. Закройте свое соединение. – Kishan

+0

Это SqlDataAdapter. При необходимости он откроет соединение. – Mithrandir

ответ

5

Использование using statement или нет, не зависит от вашего CommandType является Text или StoredProcedure.

SqlDataAdapter.Fill открывает соединение.

От Populating a DataSet from a DataAdapter

Метод Fill неявно открывает соединение, что DataAdapter использует если он находит, что соединение не открыто. Если Fill открыл соединение, он также закроет соединение, когда Fill закончит . Это может упростить ваш код при работе с одной операцией , такой как Fill или Update.

Также DbDataAdapter.Fill(DataTable)

Объект соединения, связанный с ЗЕЬЕСТ должен быть действительным, , но он не должен быть открытым. Если соединение закрыто до Вызывается Fill, он открывается для извлечения данных, затем закрывается. Если соединение открыто до вызова Fill, оно остается открытым.

С SqlDataAdapter не реализует IDisposable, вам не нужно использовать с ним инструкцию.

Если вы хотите посмотреть под капотом, вы можете проверить QuietClose method и QuietOpen method внедрения;

static private void QuietClose(IDbConnection connection, ConnectionState originalState) 
{ 
     // close the connection if: 
     // * it was closed on first use and adapter has opened it, AND 
     // * provider's implementation did not ask to keep this connection open 
     if ((null != connection) && (ConnectionState.Closed == originalState)) { 
      // we don't have to check the current connection state because 
      // it is supposed to be safe to call Close multiple times 
      connection.Close(); 
     } 
} 

// QuietOpen needs to appear in the try {} finally { QuietClose } block 
// otherwise a possibility exists that an exception may be thrown, i.e. ThreadAbortException 
// where we would Open the connection and not close it 
static private void QuietOpen(IDbConnection connection, out ConnectionState originalState) 
{ 
    originalState = connection.State; 
    if (ConnectionState.Closed == originalState) { 
     connection.Open(); 
    } 
} 
+0

Отличный ответ. Спасибо (Примите ваш ответ как можно скорее) – Aikoto

Смежные вопросы