从SQL CLR程序集返回记录集?

时间:2009-09-19 21:36:40

标签: sql-server sql-server-2005 assemblies clr sqlclr

伙计租约帮助我,我想我很亲密,但我错过了什么。

背景

我正在重写SQL CLR程序集(存储过程),我的程序集联系另一个资源并获取XML。我想将此XML作为记录集返回,而不是标量值。

从我所看到的,这是如何返回记录集:

SqlContext.Pipe.Send(mySqlDataReader)

发送方法包含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?

2 个答案:

答案 0 :(得分:3)

我猜你最好使用SqlDataRecord。您可以看到说明here

它应如下所示:

 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);

答案 1 :(得分: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()