ExecuteScalar не генерирует исключение

Я пытаюсь вставить данные в основные и подробные таблицы.

Мой основной стол Qry: 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 как нуль.

Моя функция Execute:

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;
    }
}

то, что я хочу, это то, могу ли я сделать муравей в своей старой функции, чтобы она выдавала исключение, если какое-то поле, не допускающее значение NULL, в таблице сведений передается как null без изменения подписи моей функции.


person ManojK    schedule 18.10.2016    source источник


Ответы (1)


Вы пытались использовать executenonquery()? Попробуйте использовать DBNull вместо null в своей проверке, потому что вы сравниваете числа, а не строки.

person GNMercado    schedule 18.10.2016
comment
Я не могу использовать executenonquery, так как взамен мне нужен идентификатор заказа, а также я объединяю основной и подробный запрос в одну строку и передаю функцию. Та же функция работает, если есть какой-либо неправильный столбец в деталях, но не работает для полей, не допускающих значение NULL, при передаче как null. - person ManojK; 19.10.2016
comment
Я не хочу менять подпись функции ExecuteScalarQuery. - person ManojK; 19.10.2016
comment
Попробуйте изменить if (otrans != null) otrans.Rollback(); на if (otrans != DbNull.Value) otrans.Rollback(); - person GNMercado; 19.10.2016
comment
попробовал if ((otrans != null) && (!otrans.Equals(DBNull.Value))) otrans.Rollback(); - person ManojK; 19.10.2016
comment
попробуйте удалить ((otrans != null) && - person GNMercado; 19.10.2016