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

第一:程序集不返回任何东西,它们只包含一个或多个可能返回结果集、标量值、返回值的方法。

如果您已经有一个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 回答