0

更新 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 タイプ)

4

2 に答える 2

1

これを改善するのに役立ついくつかのこと。

の最初SqlConnectionのラップ コマンドusing

2 番目は、prod がこれを実行するのに時間がかかっているように聞こえます。それがタイムアウトの理由です。タイムアウトを無制限に設定できます。

最後に、SQL Server 2008 以降を使用している場合は、バッチ挿入を使用する必要があります。

Insert into table (column1, column2) values (value1, value2), (value3, value4)

これらを動的に構築する場合のもう 1 つの注意事項は、一度に操作される値が 1,000 に制限されることです。

于 2013-10-09T23:58:46.667 に答える
0

バッチ挿入でコードを変更しましたが、問題はありませんでした。

于 2013-10-11T16:18:34.667 に答える