繁体   English   中英

从 SQL 服务器返回一个标量到 C#

[英]Returning a scalar from SQL Server to C#

我正在尝试从这样的数据库中返回标量:

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返回单行单列:

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可能会返回多行。 您可能想在 select 中添加TOP 1 - 为了安全起见:

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

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

SELECT @Result as 'Result'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM