2016-09-29 8 views
1

レコードの集合を返す.Netアセンブリを作成しました。 SQL Serverで関数を作成すると、メッセージが返される戻り値のT-SQLとCLRの型が一致しないため、関数の作成に失敗しました

戻り値のT-SQLとCLRの型が一致しないため、CREATE FUNCTION for ...が失敗しました。

私は少し失われています、誰かが間違っているか何か手がかりを持っていますか?これは私のアセンブリです:

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; 

は私がfollwingエラー受信機能を作成しようとすると:失敗しました "usp_GetMailFolders" のために

CREATE FUNCTIONをT理由戻り値のSQLとCLRの型が一致しません。

私はここで何が欠けているのか誰に気付くことができますか?

お返事ありがとうございます!

+0

私は 'C#'にはありませんが、 'IEnumerable'インターフェースを実装する必要があると思います。(https://msdn.microsoft.com/en-us/library/ms131103.aspx?f = 255&MSPPError = -2147217396) – NickyvV

+0

こんにちは、ニッキー、あなたのお返事ありがとうございます。MSDNから私はリスト<>クラスが実装することがわかってIEnumerable:パブリッククラスの一覧:IListの、ICollectionを、IEnumerableを、IListの、ICollectionを、IEnumerableを – Roeland

+0

ないように注意してくださいしかし、パブリック静的GetMailFoldersは何のフォルダIDを持っていないとSQL関数はありません。おそらくそれは問題になる可能性がありますか? – GuidoG

答えて

2

GetMailFolders関数の署名をIEnumerableに変更してください。

のpublic static IEnumerableをGetMailFolders(文字列WellKnownFolderName、文字列のフォルダID、文字列のユーザーID、文字列のパスワード)

私は再び見て、ツールを作成するためのコードに代わりにvarchar型のデータ型はnvarcharを置くことを試みるために私には思えます。

+0

こんにちはNenad、List <>クラスは既にIEnumarableインターフェイスを実装しているので、これは必要ではありません。私はそれを試してみましたが、役に立たなかった。 – Roeland

+0

.NETでは文字列にUnicode文字が含まれており、SQL Serverのn(var)charにマップされています。https://msdn.microsoft.com/en-us/library/ms131092.aspx varcharに.Netへのマッピングがありませんタイプ。 – Roeland

1

GetMailFolders関数の戻り値の型をList<mailBox>からIEnumerableに変更します。

MSDNとしての状態:再構築した後

Beginning with SQL Server 2005, SQL Server extends the functionality of table-valued functions by allowing you to define a table-valued function in any managed language. Data is returned from a table-valued function through an IEnumerable or IEnumerator object.

、データベースにアセンブリをドロップして再作成することを忘れないでください。

0

[OK]をので、あなたのすべての権利であることが判明:

public static IEnumerable GetMailFolders 

はトリックをしました。私の以前の試み(ネナドの答えTOTのコメントを参照)で、私は

IEnumerable<mailbox> 

の代わりに、すべてのご意見と回答のため

IEnumerable 

感謝を使用しました!

関連する問題