C# 为<&燃气轮机;返回值的T-SQL和CLR类型不匹配
我试图通过CRL集成创建SQL函数,但出现以下错误: “GetWSClient”的创建函数失败,因为返回值的T-SQL和CLR类型不匹配 我正在尝试使用dll中的Web服务,然后在SQL Server中将其集成为程序集 我的C#代码是: 我的SQL代码是:C# 为<&燃气轮机;返回值的T-SQL和CLR类型不匹配,c#,sql,tsql,sqlclr,sql-types,C#,Sql,Tsql,Sqlclr,Sql Types,我试图通过CRL集成创建SQL函数,但出现以下错误: “GetWSClient”的创建函数失败,因为返回值的T-SQL和CLR类型不匹配 我正在尝试使用dll中的Web服务,然后在SQL Server中将其集成为程序集 我的C#代码是: 我的SQL代码是: CREATE FUNCTION [dbo].[GetWSClient](@url nvarchar(255), @idClient nvarchar(255)) RETURNS TABLE ( Name nvarchar(255) NULL
CREATE FUNCTION [dbo].[GetWSClient](@url nvarchar(255), @idClient nvarchar(255))
RETURNS TABLE (
Name nvarchar(255) NULL
)
EXTERNAL NAME [InternalLists].[InternalLists.UserDefinedFunctions].[WSClient]
GO
我已经看到了答案,但我将我的函数声明为DataSet返回类型,并且我知道我的WS正在返回一个DataSet结果
那么,我做错了什么??T-SQL表数据类型与数据集数据类型不同。SQLCLR程序集中的UDF需要返回IEnumerable类型,而DataSet不实现IEnumerable 您可以将函数转换为返回IListSource.GetList(),该函数实现IEnumerable,类似于:
return ((IListSource)client.WM_CLIENT(idClient.ToString())).GetList();
标准警告适用-未经测试-但这可能会给你一个正确的方向推动。祝福 您正在创建一个CLR表值函数。从的文档中,以下是一个示例:
using System;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Data.SqlTypes;
using System.Diagnostics;
public class TabularEventLog
{
[SqlFunction(FillRowMethodName = "FillRow")]
public static IEnumerable InitMethod(String logname)
{
return new EventLog(logname).Entries;
}
public static void FillRow(Object obj, out SqlDateTime timeWritten, out SqlChars message, out SqlChars category, out long instanceId)
{
EventLogEntry eventLogEntry = (EventLogEntry)obj;
timeWritten = new SqlDateTime(eventLogEntry.TimeWritten);
message = new SqlChars(eventLogEntry.Message);
category = new SqlChars(eventLogEntry.Category);
instanceId = eventLogEntry.InstanceId;
}
}
您需要返回一个
IEnumerable
或IEnumerable
。运行时将负责枚举该IEnumerable
,将每个枚举对象传递给Fill Row方法(作为上例中的第一个参数,object obj
),并负责将其映射为可以通过TDS向下喷射到客户端的内容,其中客户端根据它是什么,将其转换为结果集。谢谢,这正是问题所在,我正在返回一个数据集,因此需要将其转换为IEnumerable。
using System;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Data.SqlTypes;
using System.Diagnostics;
public class TabularEventLog
{
[SqlFunction(FillRowMethodName = "FillRow")]
public static IEnumerable InitMethod(String logname)
{
return new EventLog(logname).Entries;
}
public static void FillRow(Object obj, out SqlDateTime timeWritten, out SqlChars message, out SqlChars category, out long instanceId)
{
EventLogEntry eventLogEntry = (EventLogEntry)obj;
timeWritten = new SqlDateTime(eventLogEntry.TimeWritten);
message = new SqlChars(eventLogEntry.Message);
category = new SqlChars(eventLogEntry.Category);
instanceId = eventLogEntry.InstanceId;
}
}