3

この質問は以前に回答されていることに気付きました。回答を調べて、自分のやり方の誤りを見つけようとしましたが、立ち往生しています。一意のキーを返す次のストアド プロシージャがあります。

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER   PROCEDURE [dbo].[newid] @tablename AS CHAR(10), @fieldname AS CHAR(15) = '', @ioffset AS INT, @theID as int = 0 output 
AS
BEGIN
  SET NOCOUNT ON

 DECLARE @value AS INT
 IF @ioffset < 1 SET @ioffset = 1
 IF LEN(@fieldname) > 0
  BEGIN
    UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname)
   SELECT @value
  END
 ELSE
  BEGIN
   UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename)
   SELECT @value 
  End
 SET NOCOUNT OFF
set @theID = @value
END

次のコードを使用して、プロシージャにアクセスしようとしています。

using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand command = new SqlCommand("dbo.NewID", connection)
     { CommandType = CommandType.StoredProcedure } )
{
     command.Parameters.Add( new SqlParameter("@tablename",table));
     command.Parameters.Add( new SqlParameter("@fieldname",field));
     command.Parameters.Add( new SqlParameter("@ioffset",1));
     SqlParameter key = new SqlParameter("@theID", SqlDbType.Int);
     key.Direction = ParameterDirection.Output;
     command.Parameters.Add(key);

     connection.Open();
     result = command.ExecuteNonQuery();
     connection.Close();
}

key.Value は空に戻り、result は -1 であり、プロシージャの実行中にエラーが発生したことをほのめかしています。私が間違っているかもしれないことを誰かが見たら、助けていただければ幸いです。

注意: すでにいくつかのクラスで使用されているため、実際の手順を編集することはできません。

何卒よろしくお願い申し上げます。

4

3 に答える 3

2

私はこの行を変更しようとします:

command.Parameters.Add(new SqlParameter("@ioffset",1)); 

SqlParameter pOffset = command.Parameters.Add( new SqlParameter("@ioffset", SqlDbType.Int)); 
pOffset.Value = 1;

使用しているコンストラクターに既知のバグがあります。MSDNのコミュニティコメントを見てください。この問題は、標準コンストラクターのあいまいさを取り除いた
新しいメソッドによってある程度解決されました。SqlParameter.AddWithValue

于 2012-07-25T19:46:48.880 に答える
1

解決済み

たくさんの回答をいただいた皆様、ありがとうございました。Steve のアドバイスを受けて、SQL Management Studio から手順を実行したところ、そこでも問題が発生しました。入力を少しいじった後、使用していることがわかった

String table = "dbo.tablename";

これを次のように変更したとき

String table = "tablename";

すべてが期待どおりに機能し始めました。

これは、SQL を十分に把握していない私の愚かな間違いでした。素晴らしい提案をありがとうございました。

于 2012-07-30T19:26:43.137 に答える
0
 command.Parameters.Add( new SqlParameter("@tablename",table));
 command.Parameters.Add( new SqlParameter("@fieldname",field));
 command.Parameters.Add( new SqlParameter("@ioffset",1));

このようにパラメーター リストに追加する場合は、パラメーターの型を指定する必要があります。

または、おそらく機能する次のようにすることもできます。

 command.Parameters.AddWithValue("@tablename",table);
 command.Parameters.AddWithValue("@fieldname",field);
 command.Parameters.AddWithValue("@ioffset",1);

それを試してみてください。

于 2012-07-25T19:50:19.810 に答える