3

3つのOUTPUTパラメータを持つSQLプロシージャを呼び出しています。procの呼び出し後、他の2つが値を返す場合、パラメータの1つは値を返しません。プロファイラーは、3つの値すべてが返されていることを示しています。

パラメータは、プロシージャで次のように宣言されます。

@UsrVariableID INT OUTPUT,
@OrganisationName NVARCHAR(256) OUTPUT,
@Visible bit OUTPUT

procを呼び出すコードは次のようになります...

cm.Parameters.AddWithValue("@OrganisationName", name);
cm.Parameters["@OrganisationName"].Direction = ParameterDirection.Output;
cm.Parameters.AddWithValue("@Visible", visible);
cm.Parameters["@Visible"].Direction = ParameterDirection.Output;

cm.ExecuteNonQuery();

name = cm.Parameters["@OrganisationName"].Value.ToString();
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());
id = int.Parse(cm.Parameters["@UsrVariableID"].Value.ToString());

失敗するパラメータは@OrganisationNameです。

paramはコードではstring型ですが、procではNVARCHARであるためかどうか疑問に思います。

誰かアイデアがありますか?

4

7 に答える 7

5

可変長のデータ型(nvarchar、varcharなど)を持つ出力パラメーターを使用すると、より明示的にするとより良い結果が得られることがわかりました。投稿した場合、C#側でタイプが指定されていません。私はおそらく次のように物事を変更するでしょう:

SqlParameter theOrganizationNameParam = new SqlParameter( "@OrganisationName", SqlDbType.NVarChar, 256 );
theOrganizationNameParam.Direction = ParameterDirection.Output;
cm.Parameters.Add( theOrganizationNameParam );
cm.ExecuteNonQuery();
name = theOrganizationNameParam.Value;

これにより、出力パラメータが正しいデータ型を持っていることを保証できるため、例外がスローされることなくValueプロパティにアクセスできます。

これがいくつかの光を当てることを願っています。

于 2008-10-29T18:12:44.017 に答える
2

最初にパラメーターを宣言して(次に値を設定して)、これが違いを生むかどうかを確認してみてください。

cm.Parameters.Add["@OrganisationName", SqlDbType.NVarChar, 256].Direction = ParameterDirection.Output
cm.Parameters["@OrganisationName"].Value = name

しかし、私には、あなたが投稿したものに何も問題はないように見えます。

ちなみに、.Parse(.ToString())が必要ない場合は、キャストするだけで済みます。

visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());

になります

visible = (bool)cm.Parameters["@Visible"].Value;
于 2008-10-29T17:48:56.390 に答える
1

MS SQL については 100% 確信が持てませんが、.NET --> Oracle では文字列バッファ サイズを指定する必要があります。

cm.Parameters["@OrganisationName"].Size = 256;
于 2008-10-29T17:52:58.833 に答える
0

実際、それは型を宣言することではありません。

サイズが変化する出力パラメータの場合、パラメータサイズを指定する必要があります。

cm.Parameters["@OrganisationName"].Size = 50;

特定のデータ型にサイズが指定されていない場合に例外を発生させる実装のバグがどこかにあったことを読みました。

全体として、nvarchar(max)のように、サイズが不明なパラメーターを返すのには適していません。出力パラメータではなく、SELECTを介して戻り値を返すことをお勧めします。

于 2009-05-06T12:56:34.150 に答える
0

みんなありがとう、AdyとScottが示唆したように、パラメーター宣言で型を明示的に宣言することで解決しました。より簡潔だったので、Scottsの回答を選びました。

于 2008-10-30T08:50:14.683 に答える
0

代わりに ParameterDirection.InputOutput を使用してください - これは機能します

詳細については、ここの最後のコメントを参照してください - http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic28087.aspx

于 2009-05-06T12:46:44.220 に答える
0

はい、ここで多くのことを試しましたが、機能する唯一のことは、文字列のサイズを指定する必要があることです。

文字列 nvarchar(7) を返すストアドプロシージャがあり、C#.NET 側で size=255 を指定しました。これは、7 文字の文字列を受け取るために機能しています....

コードはもっと専門的でなければならないので、私はこれが好きではありませんでした...とにかく...

于 2010-07-07T16:01:27.260 に答える