更新 1: 以下のコードは私の DEV マシンでは正常に動作しますが、TEST/Production サーバーでは失敗します。
public TransImport()
{
ConnString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
SqlConnection conn_new;
SqlCommand command_serial_new;
SqlTransaction InsertUpdateSerialNumbers;
conn_new = new SqlConnection(ConnString);
command_serial_new = conn_new.CreateCommand();
command_serial_new.CommandText = "SELECT 1 FROM YSL00020 WITH (NOLOCK) WHERE SERLNMBR = @slnr";
var p = new SqlParameter("@slnr", SqlDbType.NVarChar, 50);
command_serial_new.Parameters.Add(p);
InsertUpdateSerialNumbers = conn.BeginTransaction();
boolean bErrors = false;
while (!headerFileReader.EndOfStream)
{
headerRow = headerFileReader.ReadLine();
if (!CheckSerialNumber(headerFields[0].Trim()))
{
bErrors = true;
break;
}
}
if (bErrors)
InsertUpdateSerialNumbers.Commit();
else
InsertUpdateSerialNumbers.Rollback();
if (conn_new != null)
{
conn_new.Close();
conn_new.Dispose();
}
}
private Boolean CheckSerialNumber(string SerialNumber)
{
command_serial_new.Parameters["@slnr"].Value = SerialNumber;
try
{
var itExists = Convert.ToInt32(command_serial_new.ExecuteScalar()) > 0;
if (!itExists)
{
command_serial.Transaction = InsertUpdateSerialNumbers;
command_serial.CommandText = "INSERT INTO YSL00([Manifest_Number],[PONUMBER],[ITEMNMBR],[SERLNMBR]"
+ "VALUES ('" + Manifest + "','" + PONr + "','" + itemNumber + "','" + serialNr + "')";
var insertStatus = command_serial.ExecuteNonQuery();
return true;
}
}
catch (Exception ex)
{
LogException(ex, "Error in CheckSerialNumber =>"+ command_serial_new.CommandText.ToString());
}
return false;
}
上記のコードで直面している問題:
コミットとロールバックで SQLTransaction を使用しています。フラット ファイルをループして、いくつかのテーブルを更新します。ファイルには通常、約 500 ~ 1000 行が含まれます。すべての行に対して (sqltransaction を使用して) INSERT ステートメントを作成していますが、COMMIT ステートメントでプログラムが長時間停止し、最終的に以下に示すようなエラーが発生します。ただし、sqltransaction 全体 (およびコミットとロールバック) をコメントアウトした場合、すべて問題ありませんが、コミットとロールバックが必要です。以下のようなエラーが発生しないように、トランザクションを 1 つだけ作成する方法はありますか (現在、INSERT ステートメントごとに作成しています)。
System.ServiceModel.CommunicationException
パイプからの読み取り中にエラーが発生しました: パイプは終了しました。(109、0x6d)。mscorlib
サーバー スタック トレース: System.ServiceModel.Channels.StreamConnection.Read(Byte[] バッファー、Int32 オフセット、Int32 サイズ、TimeSpan タイムアウト) で System.ServiceModel.Channels.SessionConnectionReader.Receive(TimeSpan タイムアウト) で System.ServiceModel.Channels. System.ServiceModel.Channels.FramingDuplexSessionChannel.Receive (TimeSpan タイムアウト) での SynchronizedMessageSource.Receive (TimeSpan タイムアウト) System.ServiceModel.Channels.FramingDuplexSessionChannel.TryReceive (TimeSpan タイムアウト、Message& メッセージ) で System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message)メッセージ、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannel.Call(String アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String)アクション、System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) で Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs)
[0] で再スローされた例外: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) で System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 タイプ)