1

みんなのリースが私を助けてくれます 私は近くにいると思いますが、何かが足りない.

バックグラウンド

SQL CLR アセンブリ (ストアド プロシージャ) を書き直しています。アセンブリは別のリソースに接続し、XML を取得します。この XML をスカラー値ではなく、レコードセットとして返したいと考えています。

私が見たものから、これはレコードセットを返す方法です:

SqlContext.Pipe.Send(mySqlDataReader)

Sendメソッドは、次の 3 つのパラメーターを受け取ります。

public void Send(string message);
public void Send(SqlDataRecord record);
public void Send(SqlDataReader reader);

SqlDataReaderクラスにはコンストラクターがありません。SqlCommand.ExecuteReader() はどのようにコンストラクターを返しますか?

私がしなければならないと思うこと

  • IDataReaderから継承する独自のクラスを作成します 。
  • このクラスで XML を使用し、それをレコードとして公開します (DataReader など)。
  • SqlDataReader をオーバーライドし、これを SqlContext.Pipe.Send(mySqlDataReader) に渡します ???

ここがぼやけます。

カスタム レコードセットを SQL Server に戻すにはどうすればよいですか?

4

2 に答える 2

3

SqlDataRecord を使用したほうがよいと思います。ここで説明を見ることができます

次のようになります。

 SqlDataRecord record = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("Column1", SqlDbType.NVarChar)});

 // Set the record fields.
 record.SetString(0, youVariableWithXmlData);

 // Send the data
 SqlContext.Pipe.Send(record);
于 2009-09-20T15:45:11.713 に答える
0

まず、アセンブリは何も返しません。アセンブリには、結果セット、スカラー値、戻り値を返す可能性のある 1 つ以上のメソッドが含まれているだけです。

すでに持っている場合SqlDataReader(質問の文言からは不明)、結果セットが返されることに非常に近づいています。

SqlDataReader クラスにはコンストラクターがありません。SqlCommand.ExecuteReader() はどのようにコンストラクターを返しますか?

ExecuteReaderメソッドが を作成する方法は重要でSqlDataReaderはありません。重要なの、それを返すということSqlDataReaderです。したがって、次のことを行うだけです。

SqlDataReader _Reader = SqlCommand.ExecuteReader();
SqlContext.Pipe.Send(_Reader);
// be sure to call .Dispose() on the SqlDataReader, SqlCommand, and SqlConnection objects,
// if they are not each in their own using() blocks

この方法は非常に効率的ですが、結果セットの行として返す前に SqlDataReader の行をインターセプトすることはできません。したがって、呼び出し元に値を返す前に値を操作する必要がある場合は、次のメソッドを使用しますSqlContext.Pipe

  • SendResultsStart(SqlDataRecord)
  • SendResultsRow(SqlDataRecord)
  • SendResultsEnd()
于 2015-09-04T05:56:06.653 に答える