CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配

时间:2016-09-29 08:30:14

标签: c# .net sql-server clr

我创建了一个返回一组记录的.Net程序集。当我在SQL Server中创建一个函数时,我收到消息

为...创建功能失败,因为返回值的T-SQL和CLR类型不匹配。

我有点迷茫,有没有人知道出了什么问题?这是我的集会:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Net;
using System.IO;
using System.Data.SqlTypes;
using System.Net.Json;
namespace SQLHttpRequest
{
    public partial class HTTPFunctions
    {

       public class mailBox
       {
           public bool Expanded { get; set; }
           public string ID { get; set; }
           public string Name { get; set; }
           public string ParentID { get; set; }
           public int ChildFolderCount { get; set; }
           public int UnreadItemCount { get; set; }
           public int TotalItemCount { get; set; }
       }

       public static void FillRow(object mailBoxObject
           , out SqlBoolean Expanded
           , out SqlString ID
           , out SqlString Name
           , out SqlString ParentID
           , out SqlInt32 ChildFolderCount
           , out SqlInt32 UnreadItemCount
           , out SqlInt32 TotalItemCount
            )
        {
           var mb = (mailBox)mailBoxObject;
           Expanded = mb.Expanded;
           ID = mb.ID;
           Name = mb.Name;
           ParentID = mb.ParentID;
           ChildFolderCount = mb.ChildFolderCount;
           UnreadItemCount = mb.UnreadItemCount;
           TotalItemCount = mb.TotalItemCount;
      }

    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read
            , TableDefinition = "Expanded BIT, ID NVARCHAR(100),Name NVARCHAR(max),ParentID NVARCHAR(max),ChildFolderCount INT, UnreadItemCount INT, TotalItemCount INT"
            , FillRowMethodName = "FillRow")]
    public static List<mailBox> GetMailFolders(string WellKnownFolderName, string FolderID, string UserID, string password)
       {
           List<mailBox> mbs = ReadFolder(WellKnownFolderName, UserID, password);
           // Method ReadFolder Fills the mbs List
           return mbs;
        }
   }
}

程序集接收一些参数并返回邮件文件夹列表。在SQL Server中成功创建了程序集:

 CREATE ASSEMBLY SQLHttpRequest
 FROM N'C:\...\SQLHttpRequest.dll'
 WITH PERMISSION_SET=UNSAFE;

当我尝试创建功能

    CREATE FUNCTION dbo.usp_GetMailFolders(
         @WellKnownFolderName  nvarchar(max),
         @FolderID    nvarchar(max),
         @UserID        nvarchar(max),
         @password      nvarchar(max)
    )
    RETURNS TABLE
    (
        Expanded BIT,
        ID NVARCHAR(100),
        Name NVARCHAR(100),
        ParentID NVARCHAR(100),
        ChildFolderCount int,
        UnreadItemCount int,
        TotalItemCount int
    )
    AS
    EXTERNAL NAME SQLHttpRequest.[SQLHttpRequest.HTTPFunctions].GetMailFolders;

我收到以下错误:

“usp_GetMailFolders”的CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配。

有人能发现我在这里失踪的东西吗?

提前感谢您的回复!

3 个答案:

答案 0 :(得分:2)

尝试将函数GetMailFolders的签名更改为IEnumerable。

public static IEnumerable GetMailFolders(string WellKnownFolderName,string FolderID,string UserID,string password)

我再次看了一下,在我看来尝试在代码中放置nvarchar而不是varchar来创建工具。

答案 1 :(得分:1)

GetMailFolders函数的返回类型从List<mailBox>更改为IEnumerable

正如MSDN所述:

  

从SQL Server 2005开始,SQL Server允许您在任何托管语言中定义表值函数,从而扩展了表值函数的功能。数据通过IEnumerable或IEnumerator对象从表值函数返回。

重建后,不要忘记删除并在数据库中重新创建程序集。

答案 2 :(得分:0)

好的,所以你们都证明是对的:

public static IEnumerable GetMailFolders

做了这个伎俩。在我以前的尝试中(参见Nenad的评论)我使用了

IEnumerable<mailbox> 

而不是

IEnumerable

感谢大家的意见和答案!