1

ストアド プロシージャは、新しく作成した行の 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()

4

2 に答える 2

1

ストアドプロシージャを少し変更しようと思います。

Alter Procedure dbo.udsp_insert_record
  @record_title VARCHAR(100)
AS
BEGIN
  INSERT INTO tbl_records (RecordTitle) VALUES (@record_title)
  SELECT CAST(SCOPE_IDENTITY() AS INT)
END

私が覚えていることから、SCOPE_IDENTITY()は10進型であるため、intに簡単に変換することはできません。サーバー上(私が提案するように)またはクライアントで、にキャストするExecuteScalarことによってそれを行いますDecimal

于 2012-10-12T19:13:03.283 に答える
0

ExecuteScalerは、常にオブジェクトのデータ型を返します。したがって、そこから整数値を取得するには、次のように変換する必要があります。

例えば。

object id=cmd.ExecuteScaler(...........
if(id != null)
{   
 int newId=Convert.ToInt32(id);
}
于 2012-10-12T19:04:16.997 に答える