从SQL Server返回一个标量到c#

本文关键字:一个 标量 SQL Server 返回 | 更新日期: 2023-09-27 18:02:17

我试图从这样的数据库返回标量:

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行上得到一个错误:

系统。InvalidOperationException发生
Message="String[1]: Size属性的大小为0无效。"

我做错了什么?

从SQL Server返回一个标量到c#

如果您想使用ExecuteScalar,您的存储过程需要从SELECT返回单行,单列:

ALTER PROCEDURE [dbo].[GetReason]
    @Reason_Number nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
END

然后你的代码需要读取这个值:

var returnedValue = cmd.ExecuteScalar();

并从那里使用它。当然,在这种情况下,c#代码中也不需要OUTPUT参数....

警告:存储过程中的SELECT可能可能返回多行。您可能想要添加一个TOP 1到您的选择-只是为了安全:

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

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

SELECT @Result as 'Result'