Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net &引用;将数据类型nvarchar转换为int时出错;执行存储过程并读取返回值时_.net_Sql Server_Stored Procedures_Return Value_Sqlclr - Fatal编程技术网

.net &引用;将数据类型nvarchar转换为int时出错;执行存储过程并读取返回值时

.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

我有一个clr存储过程,它有一个输出值,我正在用下面的代码从vb.net应用程序调用sp。我收到一个错误,上面写着“将数据类型nvarchar转换为int时出错”。 1125092 | 63688 | Ok |这些值正是我期望从sp返回的值,但我不明白为什么会出现转换错误。有人能帮我解决这个问题吗

调用sp的代码:

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服务是没有意义的。这对于应用层和数据库层来说都是非常低效的

其他几件事:

  • 您的.NET代码从该方法返回
    void
    ,因此捕获
    @return\u value
  • 不要使用
    AddWithValue
    方法。相反,使用正确的数据类型创建每个参数,然后设置值,然后将其添加到
    Parameters
    集合中
  • 尽管已经提到了这一问题,但关于将来创建类似的参数,即使使用
    Add
    AddWithValue(“@Result”,SqlDbType.NVarChar)
    将数据类型设置为字符串类型时,请确保还设置了maxsize/length
  • 这可能是一个问题:
    RetValue=cmd.Parameters(@Result”).value
    SqlParameter
    值的类型为
    object
    。因此,要么强制转换为字符串,要么将
    .ToString()
    添加到
    值中
  • 您不需要在
    SqlString
    输入参数上调用
    ToString()
    。所有
    Sql*
    类型都有一个
    Value
    属性,该属性返回预期.NET类型中的值。意思是,
    Profile.Value
    返回您要查找的字符串
  • 创建
    SqlPipe SqlPipe=SqlContext.Pipe但永远不要使用它。您可以在正在执行的两个位置使用它
    SqlContext.Pipe.Send()
    。因此,改用:
    sqlPipe.Send()

  • 请始终发布完整准确的错误消息,而不仅仅是其中的一部分。谢谢