[英]Scalar valued function from SQL Server not returning value when called from C#
我得到了这个 function
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# 代码中调用它
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 服务器检查时,它也会返回适当的返回值。
您将标量 function 视为存储过程,这是此类执行的错误类型。 您需要带有标量函数的“CommandType.Text”。
C#
部分的其他说明:
SqlConnection
和SqlCommand
的using
块(让 using 子句为您处理处置和关闭连接部分)。const string
这是 C# 代码:
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
}
对于 function GET_WEBGIS_ISSUE_NUM
也许你可以避免额外的IF
这行:
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;
更常见的是使用SELECT
语句返回标量 function 结果。 当您使用EXECUTE
时(由于CommandType.StoredProcedure
),您还需要指定一个返回参数并在执行后从该参数中检索结果:
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;
如对您问题的评论中所述,请考虑此方法的并发含义。 将返回重复值,直到行数更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.