いくつかの内部結合を持つSQL Select文があるコンソールアプリケーションがあります。この文のすべての結果に対して、 C#を使用して新しい値を返します。ここでSQL SELECT文の結果を繰り返し処理して特定のテーブルを更新する方法
私はすでに試した何:
using System;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace MyProgram
{
class Program
{
private static SqlConnection _connection;
private static SqlTransaction _transaction;
static void Main(string[] args)
{
using (var connection = new SqlConnection())
{
try
{
connection.ConnectionString = ConfigurationManager.ConnectionStrings["myConfig"].ConnectionString;
connection.Open();
_connection = connection;
using (var command = connection.CreateCommand())
{
command.CommandText =
"My Select sql stament with inner joins";
using (var reader = command.ExecuteReader())
{
var indexOfColumn3 = reader.GetOrdinal("IDExtObject");
while (reader.Read())
{
_transaction = _connection.BeginTransaction("UpdateTransaction");
command.Transaction = _transaction;
var extId = reader.GetValue(indexOfColumn3).ToString();
string finalId = "Something new...";
try
{
UpdateIdSqlTransaction(extId, finalId);
_transaction.Commit();
}
catch (Exception)
{
_transaction.Rollback();
}
}
}
}
}
catch (Exception)
{
if (_transaction != null)
_transaction.Rollback();
}
finally
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
}
}
Console.ReadLine();
}
private static void UpdateIdSqlTransaction(string objectId, string newId)
{
using (_connection)
{
SqlCommand command = _connection.CreateCommand();
command.Connection = _connection;
var commandText = "The update SQL statement...";
command.CommandText = commandText;
command.Parameters.AddWithValue("@ID", objectId);
command.Parameters.AddWithValue("@newId", newId);
command.ExecuteNonQuery();
}
}
}
}
問題は、私はこの例外を取得していますということです。
で実行されている他のスレッドがあるので{ "新しいトランザクションが許可されていませんセッション」を参照してください。}}
これはどのような問題ですか?これをどのように達成できますか?
この「command.Transaction = _transaction;」を入力できますか? ExecuteReader文の前に? – FakeisMe
ここでトランザクションが必要なのはなぜですか? update文が単一の文である場合、その文は失敗したか、または合格したものです。処理するレコード数はいくつですか?すべてのIDを読み取り、更新ループを実行することができます。あなたはサーバー上で新しい価値を計算できますか?この場合、更新は1つのステートメントとして実行できます。 –
ルック@SergeyL私はプロセスを開始したいとレコードのいずれかが失敗した場合、私はトランザクション全体をロールバックしたい。 –