0

私は、誰かが数年前に書いた、デスクトップアプリケーション、データベース、Web サーバーアクセスの組み合わせに取り組んでいます。私の仕事は、いくつかの最適化/リファクタリングを行い、このアプリケーションに新しい機能を導入することです。私は Web アプリケーションの開発経験があまりないため、誰かが助けてくれることを願って、以下に説明する問題の解決策を見つけるのは非常に困難です。

Webアプリケーションは、私の質問に影響を与えないいくつかの小さなjavascript関数を持つASPとVBScriptで書かれています。データベースとの通信には ADODB を使用します。

データベースは MS-SQLserver 2008 データベースです。

デスクトップ アプリケーションは、データベースと通信するための .Net 組み込み機能を使用して C++/CLI で記述されています。このアプリケーションでは、すべてが機能しています。

いくつかの機能を導入するために、データベースのテーブルに新しい列を追加する必要があります。メイン テーブルの挿入と更新は、ストアド プロシージャを使用して行われます。タイプ「ビット」の「内部」という名前の列を追加しました。

    ALTER TABLE maintable
    ADD internal bit
    GO

内部列とそのパラメーターを追加するだけで、挿入と更新のストアド プロシージャを変更しました。これらの変更のみを行いました。

  • パラメーター用の 1 行
  • 挿入の列と値リストに内部的に追加されました
  • 更新用のパラメーターを含む設定内部列を追加

変更前にすでに機能していた vbscript で、内部の値を新しいパラメーターとして追加するためのコードを追加しました (挿入と更新の場合も同じです)。

    sqlcmd.Parameters.Append(sqlcmd.CreateParameter("@internal",11,1))
    sqlcmd.Parameters("@internal")=0

これらの変更の後、vbscript の更新および挿入手順が機能しなくなりました。パラメータにいくつかのデータ型を試し、列も変更しました(別の名前、別のデータ型)。何も機能しませんでした。ストアド プロシージャ自体は、データベースで直接実行した場合と、デスクトップ アプリケーションで使用した場合に正常に動作しています。
いくつかのデバッグ情報などを出力して、すべてをデバッグし始めました。この回答に従っていくつかのエラーを取得するために、ストアド プロシージャと outparameter に try/catch を追加し、すべての入力パラメーターを varchar outparameter に選択しました。これにより、次の奇妙な結果が生じました。
更新は「機能しました」(ストアドプロシージャがデータベースエラーを引き起こさず、間違った値を示さなかった入力パラメーター情報を取得したため、更新は実行されなかったため)挿入はまったく機能しませんでした。私のトレース出力は まで出力されますが、この行のsqlcmd.Execute後のトレース出力が出力されないため、この行はクラッシュしているようです。outparameter を使用しない限り、挿入自体は機能しませんでしたが、すべてのトレース出力が出力されました。コードの実行直後に、可能性のあるデータベース エラーに関する情報を取得しようとしました。

    DECLARE @ErrorVariable INT;

    SET @ErrorVariable = @@ERROR;
    SELECT @ErrorVariable AS ErrorID,
        text
        FROM sys.messages
        WHERE message_id = @ErrorVariable;
    GO

データベースエラーはありませんでした。

デスクトップ アプリケーション側からは、すべて正常に動作します。前述のように、データベースで直接実行されるストアド プロシージャは適切に機能します。エラーは web-scripting-stuff のどこかにあると思います。それでは、具体的な質問を次に示します。

  1. データベースに新しい列を追加すると (そこにある)、ストアド プロシージャまたは vbscript に構文エラーがない場合、ストアド プロシージャが (適切に) 機能しないのはなぜですか?
  2. sqlcmd.Execute挿入ストアド プロシージャに outparameter を追加すると、 が機能しなくなるのはなぜですか? ストアド プロシージャの try ブロックには、「AS BEGIN」と「END」の間のすべてが含まれ、「END」の直前に catch ブロックがあります。構文はここでも正しいです。
4

1 に答える 1