我得到了這個功能
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();
}
但是當我除錯代碼時,我一直收到空值。
注意:連接正常,已連接,當我嘗試更改函式名稱時,它產生錯誤,當我檢查 SQL Server 時,它也回傳適當的回傳值。
uj5u.com熱心網友回復:
您將標量函式視為存盤程序,這是此類執行的錯誤型別。您需要使用標量函式“CommandType.Text”。
該C#部分的其他注意事項:
- 使用
using帶有SqlConnection和的塊SqlCommand(讓 using 子句為您處理處理和關閉連接部分)。 - 查詢應宣告為
const string - 總是以分號結束查詢(即使它在沒有它的 SQL Server 中運行)。
- 避免使用短名稱,為變數選擇一個可讀的命名。
這是 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
}
對于該功能,GET_WEBGIS_ISSUE_NUM也許您可以IF使用以下行避免額外的s:
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;
uj5u.com熱心網友回復:
使用SELECT陳述句回傳標量函式結果更為常見。使用時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;
正如對您的問題的評論中所述,請考慮這種方法的并發影響。重復值將被回傳,直到行數發生變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/370168.html
標籤:C# 网站 sql-server
