#ado.net #executescalar
#ado.net #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
as
Insert into tbl_Details(OrderID,SKU,amount) Values(@OrderID,NULL,20 );
Если in tbl_Details
, SKU
не равно null, я не получу исключение, если я ExecuteScalar
сразу выполню весь запрос и передам SKU
его как null.
Моя функция выполнения:
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 без изменения подписи моей функции.
Ответ №1:
вы пробовали использовать executenonquery()? Попробуйте использовать DBNull вместо null в вашей проверке, потому что вы сравниваете с числами, а не со строками.
Комментарии:
1. Я не могу использовать executenonquery, так как мне нужен был orderid взамен, а также я объединяю основной и подробный запрос в одну строку и передаю функции. Та же функция работает, если есть какой-либо неправильный столбец в деталях, но не работает для полей, не обнуляемых при передаче как null.
2. Я не хочу изменять сигнатуру функции ExecuteScalarQuery.
3. Попробуйте изменить
if (otrans != null) otrans.Rollback();
наif (otrans != DbNull.Value) otrans.Rollback();
4. пробовал if ((otrans != null) amp;amp; (!otrans. Равно(DBNull. Значение))) otrans. Откат ();
5. попробуйте удалить
((otrans != null) amp;amp;