【问题标题】:ExecuteScalar not throwing exceptionExecuteScalar 不抛出异常
【发布时间】:2016-10-18 11:59:25
【问题描述】:

我正在尝试在主表和明细表中插入数据。

我的主表问:Insert INTO tblMain();

那我在做:

declare @OrderID as int; 
set @OrderID=scope_identity();
Update Orders SET OrderID=(LTRIM(RTRIM(OrderID))+ RIGHT('0000000'+CAST(@OrderID AS VARCHAR(7)),7)) WHERE OrderId=@OrderID;

SELECT @OrderID

然后我将使用 @OrderID 的值插入到详细信息表中 Insert into tbl_Details(OrderID,SKU,amount) Values(@OrderID,NULL,20 );

如果在tbl_Details 中,SKU 不为空,如果我一次在ExecuteScalar 中运行所有查询并将SKU 传递为空,我不会收到异常。

我的执行功能是:

public static double ExecuteScalarQuery(string SQL, ref string ErrMsg)
{
    ErrMsg = "";
    using (SqlConnection conn = new SqlConnection(GetDBConn()))
    {
        SqlTransaction otrans = null;
        double dblRetVa = 0;
        try
        {
            conn.Open();
            otrans = conn.BeginTransaction();
            SqlCommand cmd = new SqlCommand(SQL, conn);

            cmd.Transaction = otrans;
            dblRetVa = double.Parse(cmd.ExecuteScalar().ToString());
            otrans.Commit();
            conn.Close();
        }
        catch (Exception ex)
        {
            ErrMsg = ex.ToString().Trim();
            if (otrans != null) otrans.Rollback();
        }
        return dblRetVa;
    }
}

我有解决方案,但为此我必须更改函数的签名,如下所示:

public static double ExecuteNonQueryWithSelect(string SQL, string sQry2,string SelectColID , ref string ErrMsg)
{
    ErrMsg = "";
    using (SqlConnection conn = new SqlConnection(GetDBConn()))
    {
        SqlTransaction otrans = null;
        double dblRetVal = 0;
        try
        {
            conn.Open();
            otrans = conn.BeginTransaction();

            SqlCommand cmd = new SqlCommand(SQL, conn);

            cmd.Transaction = otrans;
            dblRetVal = double.Parse(cmd.ExecuteScalar().ToString());

            SqlCommand cmd2 = new SqlCommand(sQry2.Replace(SelectColID.Trim(), dblRetVal.ToString()), conn);

            cmd2.Transaction = otrans;
            cmd2.ExecuteNonQuery();

            otrans.Commit();
            conn.Close();
        }
        catch (Exception ex)
        {
            ErrMsg = ex.ToString().Trim();
            if (otrans != null) { otrans.Rollback(); dblRetVal = 0; }
        }
        return dblRetVal;
    }
}

我想要的是我是否可以在我的旧函数中做 ant 事情,以便如果明细表中的某些不可为空的字段作为 null 传递而不更改我的函数的签名,它会引发异常。

【问题讨论】:

    标签: ado.net executescalar


    【解决方案1】:

    您是否尝试过使用 executenonquery()? 尝试在验证中使用 DBNull 而不是 null,因为您正在与数字而不是字符串进行比较。

    【讨论】:

    • 我不能使用 executenonquery,因为我需要 orderid 作为回报,而且我将主要和详细查询连接到一个字符串中并传递给函数。同样的功能是,如果有任何不正确的列详细但在作为 null 传递时不适用于不可为空的字段。
    • 我不想更改 ExecuteScalarQuery 函数的签名。
    • 尝试将if (otrans != null) otrans.Rollback();更改为if (otrans != DbNull.Value) otrans.Rollback();
    • 试过 if ((otrans != null) && (!otrans.Equals(DBNull.Value))) otrans.Rollback();
    • 尝试删除((otrans != null) &&
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2013-05-24
    • 1970-01-01
    • 2010-12-09
    • 2015-12-13
    相关资源
    最近更新 更多