Почему и SqlConnection, и SqlTransaction присутствуют в конструкторе SqlCommand? - PullRequest
8 голосов
/ 25 октября 2010

Интересно, что является причиной перегрузки конструктора SqlCommand:

public SqlCommand(
    string cmdText,
    SqlConnection connection,
    SqlTransaction transaction
)

?

Когда мне нужно создать внутренний метод, которыйиспользует бит, используя транзакцию, предоставленную в качестве аргумента, я всегда нахожу достаточным только передать SqlTransaction этому методу, потому что, очевидно, соединение будет tran.Connection.
Это не относится к этомуперегрузка?Разве этого недостаточно, чтобы передать только cmdText и transaction?

Действительно ли возможно выполнить SqlCommand для соединения, обеспечив SqlTransaction открытое против другого SqlConnection?К чему это приведет?

1 Ответ

3 голосов
/ 01 марта 2011

Это интересное наблюдение, потому что вы не можете использовать транзакцию из другого соединения.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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...