插入多个记录时,C#SqlCommand返回输入参数

时间:2017-04-19 20:00:33

标签: c# sql-server wcf sqlconnection

我有一个包含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;
    } 

1 个答案:

答案 0 :(得分:1)

您正在执行DML操作,在您的情况class BaseViewController: UIViewController{ override func viewDidLoad() { super.viewDidLoad() addLeftGesture() } } class CustomViewController: BaseViewController{ } (来自您发布的代码INSERT)中,为什么new SqlCommand("InsertInvoice", con)应该是ExecuteReader()