Как Виктор уже заявил в своем последнем комментарии, вы можете использовать класс FBScript для пакетного выполнения.
Я только что столкнулся с той же задачей.Этот вопрос направил меня в правильном направлении, но мне пришлось заняться дальнейшими поисками.
В этом примере источником утверждений является внешний файл сценария:
private void ExecuteScript(FbConnection myConnection, string scriptPath) {
if (!File.Exists(scriptPath))
throw new FileNotFoundException("Script not found", scriptPath);
FileInfo file = new FileInfo(scriptPath);
string script = file.OpenText().ReadToEnd();
// use FbScript to parse all statements
FbScript fbs = new FbScript(script);
fbs.Parse();
// execute all statements
FbBatchExecution fbe = new FbBatchExecution(myConnection, fbs);
fbe.Execute(true);
}
Это будет работатьхорошо, но вы можете удивиться, почему все это не окружено транзакцией.На самом деле нет поддержки для «привязки» FbBatchExecution к транзакции напрямую.
Первое, что я попробовал, было следующее ( не будет работать )
private void ExecuteScript(FbConnection myConnection, string scriptPath) {
using (FbTransaction myTransaction = myConnection.BeginTransaction()) {
if (!File.Exists(scriptPath))
throw new FileNotFoundException("Script not found", scriptPath);
FileInfo file = new FileInfo(scriptPath);
string script = file.OpenText().ReadToEnd();
// use FbScript to parse all statements
FbScript fbs = new FbScript(script);
fbs.Parse();
// execute all statements
FbBatchExecution fbe = new FbBatchExecution(myConnection, fbs);
fbe.Execute(true);
myTransaction.Commit();
}
}
В результате возникнет исключение: «Для выполнения требуется, чтобы объект Command имелОбъект транзакции, когда объект соединения, назначенный команде, находится в ожидающей локальной транзакции. Свойство транзакции команды не было инициализировано. "
Это означает лишь то, что команды, выполняемые FbBatchExecution, не являютсяприсваивается нашей локальной транзакции, которая окружает блок кода.Здесь помогает то, что FbBatchExecution предоставляет событие CommandExecuting, где мы можем перехватить каждую команду и назначить нашу локальную транзакцию следующим образом:
private void ExecuteScript(FbConnection myConnection, string scriptPath) {
using (FbTransaction myTransaction = myConnection.BeginTransaction()) {
if (!File.Exists(scriptPath))
throw new FileNotFoundException("Script not found", scriptPath);
FileInfo file = new FileInfo(scriptPath);
string script = file.OpenText().ReadToEnd();
// use FbScript to parse all statements
FbScript fbs = new FbScript(script);
fbs.Parse();
// execute all statements
FbBatchExecution fbe = new FbBatchExecution(myConnection, fbs);
fbe.CommandExecuting += delegate(object sender, CommandExecutingEventArgs args) {
args.SqlCommand.Transaction = myTransaction;
};
fbe.Execute(true);
// myTransaction.Commit();
}
}
Обратите внимание, что я раскомментировал строку myTransaction.Commit ().Я был немного удивлен таким поведением, но если вы сохраните эту строку, транзакция выдаст исключение, сообщающее, что она уже была зафиксирована.Параметр bool fbe.Execute (true) называется «autoCommit», но изменение этого значения на false, похоже, не имеет никакого эффекта.
Я хотел бы получить некоторые отзывы, если вы видите какие-либо потенциальные проблемы с назначением локальной транзакции таким образом.или если он имеет какие-либо преимущества или может быть также опущен.