0
public TransImport()
{
    ConnString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;

    SqlConnection conn_new;
    SqlCommand command_serial_new;

    SqlConnection conn;
    SqlCommand command_serial;

    SqlTransaction InsertUpdateSerialNumbers;

    conn = new SqlConnection(ConnString);
    command_serial = conn.CreateCommand();

    conn_new = new SqlConnection(ConnString);
    command_serial_new = conn_new.CreateCommand();
    command_serial_new.CommandText = "SELECT 1 FROM YSL00 WHERE SERLNMBR = @slnr";
    var p = new SqlParameter("@slnr", SqlDbType.NVarChar, 50);
    command_serial_new.Parameters.Add(p);

    //Here you will start reading flat file to get serialnumber. 

     InsertUpdateSerialNumbers = conn.BeginTransaction();
     while (!headerFileReader.EndOfStream)
     {
         headerRow = headerFileReader.ReadLine();

         if (CheckSerialNumber(headerFields[0].Trim()))
            DisplayMessage("Good serialnumber"); //this function is not copied here.
      }
      InsertUpdateSerialNumbers.Commit();

}

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;
}

「タイムアウトの期限が切れました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません」というエラーが表示されます。

CheckSerialNumber 関数は、YSL00 (executecalar と同じテーブル。上記のコードを参照) への挿入も行います。前述したように、YSL000 テーブルを読み取って更新するフラット ファイルには数千の行があります。

これを処理するために、2 つの別個の sqlcommands と 2 つの別個の接続があることに注意してください。理由は、sqltransaction では、同じテーブルに対してクエリを実行できないためです。これが原因でタイムアウトが発生していると思いますか?

読んでくれてありがとう。提案してください

更新 1: コード全体を貼り付けていないので、プログラムで以下のコードを使用して破棄が行われることに言及したいと思います。

            if (conn != null)
            {
                conn.Close();
                conn.Dispose();
            }

            if (conn_new != null)
            {
                conn_new.Close();
                conn_new.Dispose();
            }
4

4 に答える 4

1

使用しているオブジェクトの多くはIDisposableを実装しており、それらをusing ステートメントでラップする必要があります。これらの using ステートメントがないと、.NET は、ガベージ コレクターが実行される未確定の時間までオブジェクトを必ずしも削除しません。また、どこかでトランザクションを開いたままにしておくと、後続のクエリをブロックする可能性があります。

たとえば、 using ステートメントで接続をラップする必要があります。

    using (conn_new = new SqlConnection(ConnString)) {
        ...
于 2013-10-09T20:35:58.820 に答える
0

私が間違っていなければ、ファイルの内容をテーブルの内容とマージする必要があります。この目的のために、私はあなたをお勧めします

  1. ファイルの内容を一時テーブルにコピーします (一時テーブルBulkInsertを参照) 。
  2. コマンドMERGE ( http://msdn.microsoft.com/en-us/library/bb510625.aspx ) を使用して、一時テーブルの内容を元のテーブルとマージします。
于 2013-10-09T20:41:07.860 に答える