1

十分にテストされ、SQL ServerManagementStudioから完全に機能するストアドプロシージャがあります。この手順では、テーブルにレコードが存在するかどうかを確認し、存在する場合はレコードを返すか、レコードを作成して存在しない場合はレコードを返します。

手順は次のようになります。

CREATE proc [dbo].[spInsertSerialBatch] 

@MOS_JOB varchar(12), --PASSED COMMAND LINE
@MOS_LOT varchar(4) = NULL, --PASSED COMMAND LINE
@MES_USER varchar(12) = 'NOT PASSED',--PASSED COMMAND LINE
@COMPUTERNAME varchar(100) = 'NOT PASSED' --ENVIRONMENT VARIABLE

as ....

問題なく繰り返し使用しているSqlDataAdapterを使用しています。セットアップは次のようになります。

    using (SqlCommand sqlComm = new SqlCommand("dbo.spInsertSerialBatch", serialBatchDataConnection))
                    {
                        if (serialBatchDataConnection.State != ConnectionState.Open)
                        {
                            serialBatchDataConnection.Open();
                        }



sqlComm.CommandType = CommandType.StoredProcedure;
                    sqlComm.Parameters.AddWithValue("@MOS_JOB", options.jobNumber);
                    sqlComm.Parameters.AddWithValue("@MOS_LOT", options.lotNumber);
                    sqlComm.Parameters.AddWithValue("@MES_USER", options.userId);
                    sqlComm.Parameters.AddWithValue("@COMPUTERNAME", System.Environment.MachineName);

                    SqlDataAdapter sda = new SqlDataAdapter(sqlComm);
                    DataTable dt = new DataTable();

                    int rowsAffected = sda.Fill(dt);

}

次に、Fillが実行された後、テーブルの結果を調べます。行がテーブルに存在する場合は正常に機能しますが、存在しない場合、ストアドプロシージャがそれを生成する必要がある場合、Fillは0行を返し、データテーブルは空のままになります。エラー/例外はスローされません。結果が得られません。

ExecuteNonQueryを使用し、DataAdapterを使用しないようにコードを変更できると思いますが、これがうまく機能しない理由はわかりません。データリーダーを使用してデータをループして結果を取得するよりも、データテーブル(場合によっては複数の行になる可能性があります)を使用する方が好きです。

これが失敗する理由について何か提案はありますか?このサイトや他の類似したサイトのいくつかの投稿を調べましたが、満足のいく答えは見つかりませんでした。どんな提案でも大歓迎です。

ありがとう、

ゲイリー

entrire spは非常に大きく、おそらくプロプライエタリすぎて公開できません...

        --return inserted rows
        SELECT 'CREATED' as [spRESULT], o.* 
        FROM @output o 

        END         

/*
    * Return existing SerialBatch(s)
    */
    BEGIN

        SELECT 'RETRIEVED' as [spRESULT], s.* 
        FROM SerialBatch s
        WHERE SerialBatchId = @formattedId

        UNION 
        /* 
        * pull in products that have components that need labels as well
        */
        SELECT 'RETRIEVED' as [spRESULT],s.* 
        FROM SerialBatch s
        WHERE SerialBatchParentId = @formattedId
    END 

これでストアドプロシージャは終了です。代わりにDataReaderを実行しようとしましたが、結果は同じです... spが作成する必要がある場合の結果は得られませんが、SQL ServerManagementStudioで完全にスタンドアロンで実行されます。

4

1 に答える 1

2

問題が解決しました。Oracle に渡された OpenQuery 文字列が空の文字列を NULL に変換し、新しい行が返されなかったことが判明しました。追加する必要があるのは、NULL と空の文字列の両方のチェックだけです。

if @MOS_LOT IS NULL or @MOS_LOT = ''
    set @MOS_LOT = ' ' --EMPTY STRINGS BEING EQUIVALENT TO NULLS 
于 2012-05-31T15:16:20.957 に答える