我试图拼凑几个TVR的,我坚持了以下错误:Web服务调用使用CLR表值函数
An error occurred while getting new row from user defined Table Valued Function :
System.InvalidCastException: Unable to cast object of type 'System.Char' to type 'ResultRow'.
System.InvalidCastException at CLR.WorkFunctions.FillRow(Object resultsObj, SqlString& policyURL, SqlString& fileCachePath, SqlString& identity, SqlString& format, SqlString& userName, SqlString& password, SqlString& data)
我试图调用做一些Web服务处理传递的数据,然后将返回的值加载到枚举器中。但是,如上所示,我反复出现打字错误,此时我不知道为什么。我的想法是它变得越来越难过,因为我试图用字符串填充行而不是SqlStrings,所以我改变了它。但是,Web服务只接受字符串参数,所以我必须通过Web服务调用将它们转换。这里是我的代码:
public class WorkFunctions
{
private class ResultRow
{
public string PolicyURL;
public string FileCachePath;
public string Identity;
public string Format;
public string UserName;
public string Password;
public string Data;
}
[Microsoft.SqlServer.Server.SqlFunction(
FillRowMethodName = "FillRow",
TableDefinition = "policyName nvarchar(500), fileCache nvarchar(500),
identity nvarchar(500), format nvarchar(500), userName nvarchar(500),
password nvarchar(500), data nvarchar(500)")]
public static IEnumerable Work(SqlString serviceURL, SqlString policyURL, SqlString fileCachePath, SqlString identity, SqlString format, SqlString userName, SqlString password, SqlString data)
{
IEnumerable values;
try
{
CLR.Work.WorkService.WorkMethods workMethods = new CLR.Work.WorkService.WorkMethods();
workMethods.Url = Convert.ToString(serviceURL);
values = workMethods.Work(Convert.ToString(policyURL), Convert.ToString(identity), Convert.ToString(format), Convert.ToString(userName), Convert.ToString(password), Convert.ToString(fileCachePath), Convert.ToString(data));
}
catch (Exception ex)
{
return "Failed to return data";
}
return values;
}
public static void FillRow(Object resultObj,
out SqlString policyURL, out SqlString fileCachePath,
out SqlString identity, out SqlString format,
out SqlString userName, out SqlString password,
out SqlString data)
{
ResultRow resultRow = (ResultRow)resultObj;
policyURL = new SqlString(resultRow.PolicyURL);
fileCachePath = new SqlString (resultRow.FileCachePath);
identity = new SqlString (resultRow.Identity);
format = new SqlString (resultRow.Format);
userName = new SqlString (resultRow.UserName);
password = new SqlString (resultRow.Password);
data = new SqlString (resultRow.Data);
}
}
}
这是我第一次与TVF的工作,我在一个小的损失的是关于什么可能在这一点上会造成这个问题。如果有人能提供一些想法,我会很感激。
谢谢。
谢谢,这是有道理的。 Web服务函数返回一个字符串,并且更改Web服务不是一个选项,所以我无法将其更改为键入ResultRow。最好的路径是以某种方式使用字符串列表吗? 另外,感谢有关知识库的负责人。这听起来非常有用。 – user2498668
@ user2498668如果它返回一个字符串,它是XML还是JSON字符串?如果是XML,可以在C#代码或T-SQL中解析,如果使用JSON,则需要在C#中解析,除非您计划使用SQL Server 2016.但是,目前您的TVF正在返回结果集字段在'ResultRow'中定义,因此您需要将数据解析为该数据或者考虑新的结构。为什么要列出字符串?除非你的意思是简单地从Web服务中分离出返回值,在这种情况下也是可以的。如果您发布了来自Web服务的回报,我可能会更具体。 –