Это интересное наблюдение, потому что вы не можете использовать транзакцию из другого соединения.System.Data.SqlClient.SqlCommand (4.0) имеет закрытый член с именем ValidateCommand , который содержит несколько проверочных проверок, включая эту:
if ((this._transaction != null) && (this._activeConnection != this._transaction.Connection))
{
throw ADP.TransactionConnectionMismatch();
}
Общий дизайн класса SqlCommand:для гибкости.Свойства CommandText, Connection и Transaction (которые также представлены в трех дополнительных перегрузках конструктора) доступны для чтения / записи.Это делает класс гибким, но также склонным к неправильному использованию.
Конечно, все было бы намного чище, если бы свойства были доступны только для чтения, а конструкторы использовались в качестве основного средства передачи данных в объект.В этом случае следующий конструктор будет иметь больше смысла:
public SqlCommand(string commandText, SqlTransaction transaction)
Однако я мог бы предположить, что эти свойства предназначены для чтения / записи, чтобы включить поддержку конструктора drag-n-drop, когда объект создается с использованием значения по умолчанию.конструктор и свойства задаются в методе InitializeComponent .