.net &引用;将数据类型nvarchar转换为int时出错;执行存储过程并读取返回值时
我有一个clr存储过程,它有一个输出值,我正在用下面的代码从vb.net应用程序调用sp。我收到一个错误,上面写着“将数据类型nvarchar转换为int时出错”。 1125092 | 63688 | Ok |这些值正是我期望从sp返回的值,但我不明白为什么会出现转换错误。有人能帮我解决这个问题吗 调用sp的代码:.net &引用;将数据类型nvarchar转换为int时出错;执行存储过程并读取返回值时,.net,sql-server,stored-procedures,return-value,sqlclr,.net,Sql Server,Stored Procedures,Return Value,Sqlclr,我有一个clr存储过程,它有一个输出值,我正在用下面的代码从vb.net应用程序调用sp。我收到一个错误,上面写着“将数据类型nvarchar转换为int时出错”。 1125092 | 63688 | Ok |这些值正是我期望从sp返回的值,但我不明白为什么会出现转换错误。有人能帮我解决这个问题吗 调用sp的代码: Try Dim CN As New SqlConnection CN.ConnectionString = My.Settings.m
Try
Dim CN As New SqlConnection
CN.ConnectionString = My.Settings.myConnection
CN.Open()
Dim Profile As String = "40T"
Dim StartPosition As String = "53.6924582,-2.8730636000"
Dim Destination As String = "46.18186,1.380222"
Dim RetValue As String = "Testvalue"
Dim test As String ="53.816408201,-2.990582799997"
Dim cmd As SqlCommand = New SqlCommand("GetDistanceAndTime", CN)
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "GetDistanceAndTime"
cmd.Parameters.AddWithValue("@Profile", Profile )
cmd.Parameters.AddWithValue("@StartPosition", StartPosition)
cmd.Parameters.AddWithValue("@Destination", Destination)
cmd.Parameters.AddWithValue("@Result", SqlDbType.NVarChar )
cmd.Parameters("@Result").Direction = ParameterDirection.Output
Try
cmd.ExecuteNonQuery()
RetValue = cmd.Parameters ("@Result").value
If RetValue .Length > 2 Then
End If
Catch ex As Exception
MessageBox.Show(Err.Description)
End Try
Catch ex As Exception
MessageBox.Show(Err.Description)
End Try
clr sp代码:
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1(SqlString Profile, SqlString StartPosition, SqlString Destination, ref SqlString Result)
{
SqlString result;
try
{
SqlPipe sqlPipe = SqlContext.Pipe;
result = DistanceRequest.InvokeService(Profile.ToString(), StartPosition.ToString(), Destination.ToString());
Result = result.ToString();
SqlContext.Pipe.Send(result.ToString());
}
catch (Exception ex)
{
result = ex.Message;
SqlContext.Pipe.Send(result.ToString());
}
}
}
奇怪的是,当我从SQLServer管理器执行存储过程时,它将返回值编译为int!我更是莫名其妙
USE [myDB] GO
DECLARE @return_value int, @Result nvarchar(50)
EXEC @return_value = [dbo].[GetDistanceAndTime]
@Profile = N'40T',
@StartPosition = N'53.6924582,-2.8730636000',
@Destination = N'46.18186,1.380222',
@Result = @Result OUTPUT
SELECT @Result as N'@Result'
SELECT 'Return Value' = @return_value
GO
主要问题在于这一行:
AddWithValue(“@Result”,SqlDbType.NVarChar)
问题在于,SqlDbType.NVarChar
是一个enum
,但在这里被错误地用作“值”来暗示来自的数据类型。默认情况下,数据类型为int
。这就是为什么将存储过程的Result
参数转换为int
时出错的原因,该参数是通过上面显示的行为SqlCommand
参数声明的
第二个问题是:
虽然我并不反对从SQLCLR中调用Web服务,但只有当进程完全包含在T-SQL中时才应该这样做。如果您已经在.NET代码中,那么只执行存储过程来调用Web服务是没有意义的。这对于应用层和数据库层来说都是非常低效的
其他几件事:
void
,因此捕获@return\u value
AddWithValue
方法。相反,使用正确的数据类型创建每个参数,然后设置值,然后将其添加到Parameters
集合中Add
:
AddWithValue(“@Result”,SqlDbType.NVarChar)
将数据类型设置为字符串类型时,请确保还设置了maxsize/lengthRetValue=cmd.Parameters(@Result”).value
SqlParameter
值的类型为object
。因此,要么强制转换为字符串,要么将.ToString()
添加到值中
SqlString
输入参数上调用ToString()
。所有Sql*
类型都有一个Value
属性,该属性返回预期.NET类型中的值。意思是,Profile.Value
返回您要查找的字符串SqlPipe SqlPipe=SqlContext.Pipe代码>但永远不要使用它。您可以在正在执行的两个位置使用它SqlContext.Pipe.Send()
。因此,改用:sqlPipe.Send()
请始终发布完整准确的错误消息,而不仅仅是其中的一部分。谢谢