从另一台服务器获取数据并将其插入我的服务器时出现 HierarchyId 错误 c#
Getting error for HierarchyId while fetching the data from another server and inserting it into my server c#
错误是
The type of column 'MemberHId' is not supported. The type is '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 由 table 类型参数 @MemberHType
和过程 returns 行组成,这些列为:
Name | Type
------------+----------
Code | varchar
Description | varchar
NodeID | smallint
MemberHId | hierarchyid
Level | smallint
这是程序:
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.
堆栈跟踪:
at System.Data.SqlClient.TdsParser.TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
如果我对文档的理解正确,你不能使用SqlHierarchyId
as the data type of a DataColumn
。
它没有出现在 System.Data.SqlTypes Namespace, and it also doesn't appear in the SQL Server Data Type Mappings table 中,这意味着 SQL 服务器的 HierarchyId
和.Net 框架。 (当然,已知 SQL 服务器中存在未记录的功能,但我不建议依赖它)。
然而,当您将 HierarchyId
读入您的 c# 时,您可以使用 T-SQL 中的简单 cast
将 HierarchyId
转换为 nvarchar
应用程序(在内部调用 ToString() 方法):
CAST(MemberhHId AS nvarchar(4000)) as MemberHId
并在插入数据时使用 cast
将其转换回来(在内部调用 Parse() 方法):
CAST(MemberHId AS hierarchyid)
错误是
The type of column 'MemberHId' is not supported. The type is '
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 由 table 类型参数 @MemberHType
和过程 returns 行组成,这些列为:
Name | Type
------------+----------
Code | varchar
Description | varchar
NodeID | smallint
MemberHId | hierarchyid
Level | smallint
这是程序:
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.
堆栈跟踪:
at System.Data.SqlClient.TdsParser.TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
如果我对文档的理解正确,你不能使用SqlHierarchyId
as the data type of a DataColumn
。
它没有出现在 System.Data.SqlTypes Namespace, and it also doesn't appear in the SQL Server Data Type Mappings table 中,这意味着 SQL 服务器的 HierarchyId
和.Net 框架。 (当然,已知 SQL 服务器中存在未记录的功能,但我不建议依赖它)。
然而,当您将 HierarchyId
读入您的 c# 时,您可以使用 T-SQL 中的简单 cast
将 HierarchyId
转换为 nvarchar
应用程序(在内部调用 ToString() 方法):
CAST(MemberhHId AS nvarchar(4000)) as MemberHId
并在插入数据时使用 cast
将其转换回来(在内部调用 Parse() 方法):
CAST(MemberHId AS hierarchyid)