C# 从另一台服务器获取数据并将其插入我的服务器c时,获取HierarchyId的错误

C# 从另一台服务器获取数据并将其插入我的服务器c时,获取HierarchyId的错误,c#,ssis,ado.net,hierarchical-data,azure-sql-server,C#,Ssis,Ado.net,Hierarchical Data,Azure Sql Server,错误为-不支持列“MemberHId”的类型。类型为“SqlHierarchyId” 在这两个服务器中,数据类型都是相同的HierarchyId 我只是在使用ADO.Net- 程序集是Microsoft.SqlServer.ManagedDTS版本-13.0.0.0 我们正在使用Azure Sql 尝试使用不同版本的sql程序集 DataTable dt = new DataTable(); dt.Columns.Add("Code", typeof(string)); dt.Colum

错误为-不支持列“MemberHId”的类型。类型为“SqlHierarchyId”

在这两个服务器中,数据类型都是相同的HierarchyId

我只是在使用ADO.Net-

程序集是Microsoft.SqlServer.ManagedDTS版本-13.0.0.0 我们正在使用Azure Sql

尝试使用不同版本的sql程序集

 DataTable dt = new DataTable();

 dt.Columns.Add("Code", typeof(string));
 dt.Columns.Add("Description", typeof(string));
 dt.Columns.Add("NodeId", typeof(int));
 dt.Columns.Add("MemberHId", typeof(SqlHierarchyId));
 dt.Columns.Add("Level", typeof(int));

//Getting the data from serverAPI which is returning the data in the columns without null records.
 dt=apicall();

 SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
                    returnParameter.Direction = ParameterDirection.ReturnValue;

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = spName;
                    cmd.Parameters.AddWithValue("@MemberH", dt);

                    cmd.CommandTimeout = 0;
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();// Its failing here
我的Sp由表类型param组成,它有列-

 (Code- varchar,
Description varchar,
NodeID  smallint,
MemberHId   hierarchyid,
Level   smallint)


SP- 


alter PROCEDURE [dbo].[InsertHierarchyData]  
(  
  @MemberHType MemberH READONLY  
)  
AS  



truncate table test
BEGIN TRY   

   insert into test values ('start select')

 --create table test (errormessage varchar(1000))

 IF EXISTS (SELECT TOP 1 1 FROM @MemberHType)  
 BEGIN  

 insert into test values ('Inside first Insert start')
  INSERT INTO HierarchyStaging  
  (  
   Code  
   ,[Description]  
   ,NodeID  
   ,MemberhHId  
   ,[Level]  
  )  
  SELECT    
    Code  
    ,[Description]  
    ,NodeId  
    ,MemberhHId  
    ,[Level]  
  FROM @MemberHType  
  insert into test values ('Inside first Insert end')
 END  
 END TRY    
BEGIN CATCH    
 SELECT   @comment = ERROR_MESSAGE()    
   ,@Status = 'Error'    
 SET   @comment = CONVERT(NVARCHAR(3000),@Comment) + ' Error Severity: ' + CAST(ERROR_SEVERITY() AS varchar(25)) + ' Error state: 30'    
 GOTO ErrorHandler    
END CATCH    
The Column in c# is SqlHierarchyId.
添加了异常详细信息- 在System.Data.SqlClient.TdsParser.tdsexecuterpsqlcommand cmd、_SqlRPC[]rpcArray、Int32 timeout、Boolean inSchema、SqlNotificationRequest notificationRequest、TdsParserStateObject stateObj、Boolean isCommandProc、Boolean sync、TaskCompletionSource1 completion、Int32 startRpc、Int32 startpram中 位于System.Data.SqlClient.SqlCommand.RunExecuteReaderTdsCommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async、Int32超时、任务和任务、Boolean asyncWrite、Boolean inRetry、SqlDataReader ds、Boolean describeParameterEncryptionRequest 在System.Data.SqlClient.SqlCommand.RunExecuteReaderCommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法、TaskCompletionSource1 completion、Int32超时、任务和任务、Boolean和usedCache、Boolean asyncWrite、Boolean inRetry 在System.Data.SqlClient.SqlCommand.InternalExecuteOnQueryTaskCompletionSource`1完成、字符串方法名、布尔sendToPipe、Int32超时、布尔和usedCache、布尔异步写入、布尔inRetry
在System.Data.SqlClient.SqlCommand.ExecuteOnQuery中,如果我正确理解了文档,则不能将其用作数据类型

它不会出现在中,也不会出现在表中,这意味着SQL Server的HierarchyId和.Net framework中的内置类型之间没有文档化的内置转换。当然,已知SQL Server中存在未记录的特性,但我不建议依赖这些特性

但是,您可以做的是在将HierarchyId读入c应用程序时,使用简单的T-SQL转换将其转换为nvarchar,c应用程序在内部调用该方法:

并在插入内部调用该方法的数据时使用cast将其转换回:


你能添加你的存储过程吗?Azure SQL支持hierarchyid:-你真的在使用Azure SQL数据仓库吗?我也理解在互联网上发布时隐藏敏感信息的必要性,但请不要将数据隐藏到用存储过程的@table参数中的简单数据字符串替换复杂类型的整个列表/数组/表的程度。显示带有虚拟数据的实际示例对象此问题不能仅根据其包含的信息来回答。请记住,我们谁也看不懂你的心思。如果希望回答您的问题,请创建一个适当的。好的,将编辑itHey Zohar,SqlHierarchyId存在于Microsoft.SqlServer.Types.dll中,并且在执行sp赋值时出现错误,即在将参数从C传递到sp时。是的,之所以存在,是因为它是SQL Server中的CLR类型。这并不意味着在使用ADO.Net插入表值参数时可以将其用作类型。如果我同时删除,则自动生成的DataColumn类型为SqlHierarchyId,并且错误相同,而且当我将列类型用作字符串时,它的工作方式也是一样的,这是为什么?那里的数据不会被破坏。我不确定我是否理解你最后的评论。您是说ADO.Net会自动将SQL Server的HierarchyId转换为字符串并返回给您吗?如果是这样的话,那就比我想的更简单了。。。
CAST(MemberhHId  AS nvarchar(4000)) as MemberHId
CAST(MemberHId AS hierarchyid)