1

この行に露骨に何か間違っていることがわかりますか?

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

次のようなエラーが表示されます。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

簡単に言うと、C#メソッドは次のようになります。

public static DataTable GetFilmDetails(string filmId, out string
commaSepString1)

次のストアドプロシージャが必要です(それ自体で正しく実行されます)。

com.CommandText = "CatalogGetFilmDetails2";

@CommaSepStringはストアドプロシージャの出力パラメータであるため、C#では次のようになります。

param = com.CreateParameter();
param.ParameterName = "@CommaSepString";
param.Direction = ParameterDirection.Output;
param.DbType = DbType.String;
com.Parameters.Add(param);

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

ストアドプロシージャについて知りたい場合は、次のように開始します。CREATE PROCEDURE CatalogGetFilmDetails2

(@FilmID int, @CommaSepString VARCHAR(50) OUTPUT) AS

SPは、いくつかの結合に基づいていくつかの行をテーブル変数に挿入し、そのテーブルの列xのすべての値を、コンマで区切られた値を持つ文字列に入れます。

SELECT @CommaSepString 
= STUFF((SELECT ', ' + Categ  FROM @Filme1 FOR XML PATH('')), 1,1,'')

次に、テーブルを選択します。

これをお読みいただき、誠にありがとうございます。ストアドプロシージャとC#メソッドのコード全体を公開した方が明確でしょうか?私がそれを許可されているかどうかわからず、読むには長すぎるのではないかと心配しています。

PS:commaSepStringに何か問題があるはずです!両方の場所に追加する前に、コードは完全に機能しました。

4

2 に答える 2

1

SQL Server は知りません。output知っているだけinput/outputです。なので指定すると

param.Direction = ParameterDirection.Output;

SQL Server も実際に文字列を読み取ります。値を指定していないため、SQL Server はその長さがゼロであると判断します。

信じられないことに、マジック ナンバーを指定する-1と、SQL Server によってサイズが決定されます。

param.Size = -1;

これはおそらく、ADO.NET に関する 2 番目に悪い落とし穴です。SQL がの代わりにNULL変換されるという事実のすぐ後ろに.DBNull.Valuenull

于 2012-06-04T20:32:16.580 に答える
0

問題のある行にブレークポイントを設定する必要があります。次に、パラメーター コレクションを調べて、パラメーターが存在するかどうかを確認する必要があります。
存在する場合は、その値が null かどうかを確認します。
この場合、.ToString()説明されているエラーが表示されます。

于 2012-06-04T20:11:06.277 に答える