C# 将标量从SQL Server返回到C

C# 将标量从SQL Server返回到C,c#,.net,sql,sql-server-2008,stored-procedures,C#,.net,Sql,Sql Server 2008,Stored Procedures,我试图从如下数据库中返回标量: DbConnection cn = GetConnection2(); cn.Open(); // stored procedure DbCommand cmd = GetStoredProcCommand(cn, "GetReason"); DbParameter param; param = CreateInParameter("Reason_Number", DbType.String); param.Value = number; cmd.Parame

我试图从如下数据库中返回标量:

DbConnection cn = GetConnection2();
cn.Open();

// stored procedure
DbCommand cmd = GetStoredProcCommand(cn, "GetReason");
DbParameter param;

param = CreateInParameter("Reason_Number", DbType.String);
param.Value = number;
cmd.Parameters.Add(param);

param = CreateOutParameter("Result", DbType.String);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);

cmd.ExecuteScalar();

string reason;
reason = cmd.Parameters["@Result"].Value.ToString();

if (cn.State == ConnectionState.Open)
   cn.Close();

return reason;
以下是我的存储过程:

-- =============================================
-- Create date: Today
-- Description: Input Reason # and Return Full Reason Name
-- =============================================
ALTER PROCEDURE [dbo].[GetReason]
    @Reason_Number nvarchar(50),
    @Result nvarchar(50) output  
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT @Result = Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
END
我在ExecuteScalar行上遇到错误:

发生System.InvalidOperationException异常 Message=String[1]:Size属性的大小0无效

我做错了什么?

如果要使用ExecuteScalar,则存储的进程需要从SELECT返回单行、单列:

然后您的代码需要读取该值:

var returnedValue = cmd.ExecuteScalar();
从那里开始使用。当然,在这种情况下,C代码中也不需要输出参数

警告:存储过程中的SELECT可能返回多行。为了安全起见,您可能需要在select中添加一个TOP 1:

    SELECT TOP 1 Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
如果要使用ExecuteScalar,存储的proc需要从SELECT返回单行、单列:

然后您的代码需要读取该值:

var returnedValue = cmd.ExecuteScalar();
从那里开始使用。当然,在这种情况下,C代码中也不需要输出参数

警告:存储过程中的SELECT可能返回多行。为了安全起见,您可能需要在select中添加一个TOP 1:

    SELECT TOP 1 Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';

只需在存储过程的末尾添加另一条语句,并删除输出参数

SELECT @Result as 'Result'

只需在存储过程的末尾添加另一条语句,并删除输出参数

SELECT @Result as 'Result'

@马克,谢谢。“我该怎么修呢?”马克,谢谢。我如何修复它?您对存储过程做了哪些更改我看不到谢谢我从参数列表中删除了输出参数@Result,我更改了SELECT语句以仅返回值-不将其分配给输出参数您对存储过程做了哪些更改我看不到它谢谢我从参数列表中删除了输出参数@Result,我更改了SELECT语句以仅返回值-不将其分配给输出参数