4

このエラーは私を非常に混乱させました。以下に定義する2つの出力パラメーターを持つストアドプロシージャがあります

@agentNumber int OUTPUT,
@currentAgentNum int OUTPUT,

次に、以下のSELECTステートメントを使用してデータが入力されます

SELECT @agentNumber = AgentNumber
FROM AgentIdentification
WHERE AgentTaxId = @ssn

SELECT @currentAgentNum = AgentNumber
FROM UniqueAgentIdToAgentId
WHERE AgentId = @agentId

データベースでAgentNumberは、は両方のテーブルでとして定義されていintます。ただし、C#コードでこのストアドプロシージャを呼び出すと、次のようなSQL例外が発生します。

データ型intからnvarcharへの変換中にエラーが発生しました。

出力パラメータのデータ型をに変更するnvarcharと、コードは実行されますが、返されるのは整数の最初の桁だけです。以下は、C#コードで変数がどのように定義されているかです。

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");//Output parameter - leave blank
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");//Output parameter - leave blank

outNewAgentNumber.Direction = ParameterDirection.Output;
outCurrentAgentNumber.Direction = ParameterDirection.Output;

これらのパラメータをSqlCommandオブジェクトに追加し、適切なデータベースを指定してからcommandType、を使用.ExecuteNonQuery()してプロシージャを呼び出します。繰り返しになりますが、私が本当に混乱しているのはnvarchar、データ型として使用していることを示すエラーメッセージです。これは、(私の知る限りでは)データベース側の何かを参照しているだけです。しかし、私が言ったように、私はダブル/トリプルチェックを行い、両方のAgentNumber列はタイプintです。

編集

sqlParameter宣言を開始値0に変更すると、この問題は解決しました。現在、他の2つのパラメーターで同じ問題が発生しています。

SqlParameter outOperator = new SqlParameter("@operator", "");//Output parameter - leave blank
SqlParameter outDate = new SqlParameter("@date", "");//Output parameter - leave blank
4

2 に答える 2

4

変化する

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");//Output parameter - leave blank 
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");//Output parameter - leave blank 

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", 0);//Output parameter - leave blank 
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", 0);//Output parameter - leave blank 

コードでは、最初に値を文字列として指定しています。これは、CLR 型から SQL Data Type に移行するときに varchar にマップされる文字列を渡すためです。

ランタイムが文字列として認識すると、コード全体で同じ型が保持されるため、数値 (int) 値を割り当てても、文字列として認識されます。トリックは、最初に正しいデータ型を割り当てることです。

于 2012-08-20T17:03:25.380 に答える
3

次の 2 行が原因です。

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", "");
SqlParameter outCurrentAgentNumber = new SqlParameter("@currentAgentNum", "");

空の文字列 ( "") を 2 番目のパラメーターとして指定すると、ADO.NET ランタイムはそれが文字列パラメーターであると見なします。また、長さを指定しなかったため、おそらくデフォルトで 1 文字の長さに設定されています (そのため、最初の桁のみが返されます)。

したがって、SQL パラメータのデータ型を常に明示的に定義することをお勧めします (文字列の場合は、長さも定義します!)。

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", SqlDbType.Int);
outNewAgentNumber.Direction = ParameterDirection.Output;
outNewAgentNumber.Value = 0;

また

SqlParameter outNewAgentNumber = new SqlParameter("@agentNumber", SqlDbType.NVarChar, 50);
outNewAgentNumber.Direction = ParameterDirection.Output;
outNewAgentNumber.Value = "";
于 2012-08-20T17:10:17.243 に答える