我有一個.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;
}
也許你可以分享實際的錯誤信息?此外,存儲過程代碼。否則,我們仍然猜測,它可能是任何東西。 –
如果在SP上有任何錯誤,將返回一個帶有Id和錯誤描述的表,我在這裏檢索:results [「Value_log」]。ToString();在使用2個線程運行400條記錄之後,而不是返回該數據表,返回帶有SP插入參數及其值的完全不同的XML數據集:Tipo,Cajero,TermId等。奇怪的是,不僅返回當前事務,之前插入的400個事務。所以,錯誤是CastException,在程序從SP Datatable返回的結果中找不到Value_log。 –