首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#调用Server的标量值函数不返回值

从C#调用Server的标量值函数不返回值
EN

Stack Overflow用户
提问于 2021-11-29 10:20:45
回答 2查看 310关注 0票数 0

我被赋予了这个功能

代码语言:javascript
复制
CREATE FUNCTION [dbo].[GET_WEBGIS_ISSUE_NUM]
    ()
RETURNS VARCHAR(50)
AS 
BEGIN
    DECLARE @v_new_num int, @v_new_issue_num varchar(50);
    
    SET @v_new_num = (SELECT COUNT(*) + 1 
                      FROM [dbo].[WEBGIS_ISSUE] 
                      WHERE [ISSUE_NUM] LIKE  CONCAT(FORMAT(GETDATE(), 'yyMM'), '%'));

    IF @v_new_num < 10 
        SET @v_new_issue_num = CONCAT(FORMAT(GETDATE(), 'yyMM'), '00', @v_new_num);

    ELSE IF @v_new_num < 100
        SET @v_new_issue_num = CONCAT(FORMAT(GETDATE(), 'yyMM'), '00', @v_new_num);

    ELSE
        SET @v_new_issue_num = CONCAT(FORMAT(GETDATE(), 'yyMM'), @v_new_num);
    
    RETURN @v_new_issue_num 
END;

我试着从下面的C#代码调用它

代码语言:javascript
复制
SqlConnection cnn = new SqlConnection(connectionString);

SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "[NEPS].[dbo].[GET_WEBGIS_ISSUE_NUM]";

//add any parameters the stored procedure might require
if (cmd.Connection.State == ConnectionState.Closed) //cmd.Connection.Open();
{
    cnn.Open();
    var o = cmd.ExecuteScalar();
    //blabla
    cnn.Close();
}

但是,当我调试代码时,我继续接收null。

注意:连接是正常的,它是连接的,当我尝试更改函数的名称时,它会产生一个错误,当我通过SQL Server检查时,它还返回一个适当的返回值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-29 11:24:48

您将标量函数视为存储过程,这是这种类型的执行的错误类型。您需要使用标量函数“CommandType.Text”。

关于C#部分的其他说明:

  • 使用带有SqlConnectionSqlCommandusing块(让using子句为您处理处理和关闭连接部分)。
  • 查询应该声明为SqlConnection,以分号结束查询(即使它没有分号在Server中运行)。
  • 避免使用短名称,请为变量选择可读的命名。H 213F 214

以下是C#代码:

代码语言:javascript
复制
const string query = "SELECT [NEPS].[dbo].[GET_WEBGIS_ISSUE_NUM]();";

using(SqlConnection connection = new SqlConnection(connectionString))
    using(SqlCommand command = new SqlCommand(query, connection))
    {
        connection.Open();
        var result = command.ExecuteScalar();

        // do stuff
    }

对于函数GET_WEBGIS_ISSUE_NUM,可以使用以下行避免额外的IF

代码语言:javascript
复制
CREATE FUNCTION [dbo].[GET_WEBGIS_ISSUE_NUM]
    ()
RETURNS VARCHAR(50)
AS 
BEGIN
    DECLARE @v_new_num int, @v_new_issue_num varchar(50);
    
    SET @v_new_num = (SELECT COUNT(*) + 1 
                      FROM [dbo].[WEBGIS_ISSUE] 
                      WHERE [ISSUE_NUM] LIKE  CONCAT(FORMAT(GETDATE(), 'yyMM'), '%'));

    SET @v_new_issue_num, FORMAT(GETDATE(), 'yyMM') + RIGHT('000' + CAST(@v_new_num AS VARCHAR), 4);
    
    RETURN @v_new_issue_num 
END;
票数 1
EN

Stack Overflow用户

发布于 2021-11-29 11:22:48

使用SELECT语句返回标量函数结果更为常见。当您使用EXECUTE (由于CommandType.StoredProcedure)时,您还需要指定一个返回参数,并在执行后从参数中检索结果:

代码语言:javascript
复制
var result = cmd.Parameters.Add("@result", SqlDbType.VarChar, 50);
result.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery(); //ExecuteScalar will work too but the result is null and you still need to use the parameter
var o = result.Value;

正如对您的问题的评论中所指出的,请考虑这种方法的并发性影响。重复的值将被返回,直到行计数发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70152995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档