0

メイン テーブルと詳細テーブルにデータを挿入しようとしています。

私のメインテーブル 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が null でない場合、すべてのクエリを一度に実行して null として渡すと、例外が発生しtbl_Detailsません。SKUExecuteScalarSKU

私の実行機能は次のとおりです。

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として渡された場合に例外をスローするように、古い関数でantのことを実行できるかどうかです。

4

1 に答える 1

0

executenonquery() を使ってみましたか? 文字列ではなく数値と比較しているため、検証では null の代わりに DBNull を使用してみてください。

于 2016-10-18T13:50:22.237 に答える