私は、誰かが数年前に書いた、デスクトップアプリケーション、データベース、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 のどこかにあると思います。それでは、具体的な質問を次に示します。
- データベースに新しい列を追加すると (そこにある)、ストアド プロシージャまたは vbscript に構文エラーがない場合、ストアド プロシージャが (適切に) 機能しないのはなぜですか?
sqlcmd.Execute
挿入ストアド プロシージャに outparameter を追加すると、 が機能しなくなるのはなぜですか? ストアド プロシージャの try ブロックには、「AS BEGIN」と「END」の間のすべてが含まれ、「END」の直前に catch ブロックがあります。構文はここでも正しいです。