我有一个包含4个主题的.exe
项目。每个线程调用Windows服务中托管的WCF服务并插入记录(循环从1到5,000条记录)。测试项目将尝试将20,000条记录插入到WCF服务中。 WCF服务中的服务行为是每个会话。
我使用存储过程将记录插入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 :(得分:1)
您正在执行DML操作,在您的情况class BaseViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
addLeftGesture()
}
}
class CustomViewController: BaseViewController{
}
(来自您发布的代码INSERT
)中,为什么new SqlCommand("InsertInvoice", con)
应该是ExecuteReader()