2017-04-19 107 views
0

我有一個.exe項目與4個線程。每個線程調用Windows服務中託管的WCF服務並插入一條記錄(從1到5,000條記錄循環)。測試項目將嘗試將20000條記錄插入到WCF服務中。 WCF服務中的服務行爲是每個會話。C#SqlCommand插入多個記錄時返回輸入參數

我使用存儲過程將記錄插入到SQL Server 2008R2 Express中。我遇到的問題是SqlCommand。當只有一個線程正在運行時,不會發生錯誤,但是當兩個或更多線程正在運行時,代碼將引發錯誤,但不確定錯誤類型。

如果您看下面的代碼,從.ExecuteReader讀取結果時發生錯誤(這是一個強制異常錯誤)。它不會返回我在存儲過程中定義的錯誤(我猜它永遠不會到數據庫),它會返回一個包含txn記錄所有參數的XML,但它不會僅返回當前事務,它也會從在另一個線程上運行的事務返回記錄。如果我直接在SQL Server Management Studio中執行存儲過程,它可以正常工作,所以我放棄了數據庫端的任何隔離級別問題。

正如你所看到的方法不是靜態的,SqlCommand創建和處置每個電話,所以我真的很擔心這一點。有任何想法嗎?

private InsertInvoiceDataTable SaveTransaction(Transaction Trans, ClientInfo InfoCliente) 
    { 
     InsertInvoiceDataTable returnData = new InsertInvoiceDataTable(); 

     try 
     { 
      using (SqlConnection con = new SqlConnection(ConnStr1) 
      { 

       using (SqlCommand cmd = new SqlCommand("InsertInvoice", con)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 

        cmd.Parameters.Add("@TIPO", SqlDbType.Int).Value = Trans.InvoiceType; 
        cmd.Parameters.Add("@CAJERO", SqlDbType.VarChar).Value = Trans.Cashier; 
        cmd.Parameters.Add("@TERMID", SqlDbType.Int).Value = Trans.Term; 
        cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value = Trans.DOB; 
        cmd.Parameters.Add("@CLIID", SqlDbType.VarChar).Value = InfoCliente.ClientId; 
        cmd.Parameters.Add("@VENTANETA", SqlDbType.Decimal).Value = Convert.ToDecimal(Trans.SubTotal); 
        cmd.Parameters.Add("@IMPUESTO", SqlDbType.Decimal).Value = Convert.ToDecimal(Trans.TaxTotal); 
        cmd.Parameters.Add("@VENTATOTAL", SqlDbType.Decimal).Value = Convert.ToDecimal(Trans.Total);      

        con.Open(); 

        using (SqlDataReader results = cmd.ExecuteReader()) 
        { 
         while (results.Read()) 
          { 
           InsertInvoiceRow row = returnData.NewInsertInvoiceRow(); 
           try 
           { 
            row.TIPO_log = results["Type_log"].ToString(); 
            row.VALOR_LOG = results["Value_log"].ToString(); 

           } 
           catch (Exception ex) 
           { 
            returnData.AddInsertInvoiceRow("ERROR", ex.Message); 
            break; 
           } 
           returnData.AddInsertInvoiceRow(row); 
          } 
         } 

        con.Close(); 
        cmd.Dispose(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.Error(ex); 
      returnData.AddInsertInvoiceRow("ERROR", ex.Message); 
     } 

     return returnData; 
    } 
+0

也許你可以分享實際的錯誤信息?此外,存儲過程代碼。否則,我們仍然猜測,它可能是任何東西。 –

+0

如果在SP上有任何錯誤,將返回一個帶有Id和錯誤描述的表,我在這裏檢索:results [「Value_log」]。ToString();在使用2個線程運行400條記錄之後,而不是返回該數據表,返回帶有SP插入參數及其值的完全不同的XML數據集:Tipo,Cajero,TermId等。奇怪的是,不僅返回當前事務,之前插入的400個事務。所以,錯誤是CastException,在程序從SP Datatable返回的結果中找不到Value_log。 –

回答

1

您正在執行DML操作,你的情況INSERT(從您發佈的代碼new SqlCommand("InsertInvoice", con)),那麼爲什麼ExecuteReader()它,而應該是cmd.ExecuteNonQuery()

+0

「InsertInvoice」是SQL存儲過程的名稱,使用ExecuteReader的原因是因爲SP返回一個DataTable,其中包含我在此方法中返回的信息: InsertInvoiceRow row = returnData.NewInsertInvoiceRow(); 嘗試 { row.TIPO_log = results [「Type_log」]。ToString(); row.VALOR_LOG = results [「Value_log」]。ToString(); } –