ストアド プロシージャは、新しく作成した行の ID を返す必要がありますが、そうではありません。
ストアド プロシージャの構文 (簡単に言うと):
Alter Procedure dbo.udsp_insert_record
@record_title VARCHAR(100)
AS
BEGIN
INSERT INTO tbl_records (RecordTitle) VALUES (@record_title)
SELECT SCOPE_IDENTITY()
END
これは、SQL Server Management Studio でプロシージャを実行すると期待どおりに機能します。新しい行が挿入され、その ID が返されます。ただし、以下のコードを使用して Web アプリから実行すると、エラーが発生します。
dim obj_command as New SqlCommand("udsp_insert_record",obj_connection)
obj_command.CommandType = CommandType.StoredProcedure
obj_command.Parameters.Add("@record_title",SqlDbType.VarChar).Value = "just testing"
dim n_new_record_id as Integer = obj_command.ExecuteScalar()
obj_command.Dispose() 'etc., etc.
これを実行すると、エラーが発生します
入力文字列は、正しい形式ではありませんでした
ExecuteScalar
コマンド のある行で。
私の解釈では、SQL Server は整数値を返していないということです。オブジェクト、またはDBNull
、または何かを返さなければなりません。
しかし、これはなぜですか?INSERT
とはSELECT SCOPE_IDENTITY()
同じスコープで発生しているため、SQL Server が返す ID 値は有効である必要があります (SQL Server Management Studio を使用したテストで裏付けられています)。
SQL Serverストアドプロシージャと通信するADO.NETでパラメーター化されたクエリを使用すると、実際には別のストアドプロシージャを使用して要求したものを実行するため、スコープが期待どおりではないことをどこかで読んだと思いました。これにメリットはありますか?
何か案は?
編集:使用SELECT CAST(SCOPE_IDENTITY() AS INT)
しても機能しません。また、ExecuteScalar の結果を整数値に代入していなくても、このエラーが発生します。単純に代入しても同じエラーが発生します。response.write obj_command.ExecuteScalar()