![](/img/trans.png)
[英]What is wrong with my SQL function that it always returns null when I try to retrieve its value in C#?
[英]SQL function returns Wrong in c#
我在 SQL 中有一個函數,它在 SQL 管理中執行時返回正確答案,這是我的函數
ALTER FUNCTION [dbo].[Dore1]
(@First NVARCHAR(50), @second NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @Tedad INT
SET @tedad = (SELECT COUNT(sh_gharardad)
FROM OrgGharardad
WHERE OrgGhAghdDate BETWEEN @First
AND @second)
RETURN @Tedad
END
但是當我在我的 c# 程序中使用它時,它會在此代碼中返回 0(零)值。 我在哪里寫錯了?
int dore1, dore2;
ConnectDb Contact = new ConnectDb();
Contact.connect();
SqlCommand Cmd = new SqlCommand("dore1", cnn);
SqlCommand Cmd2 = new SqlCommand("dore2", cnn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd2.CommandType = CommandType.StoredProcedure;
cnn.Open();
Cmd.Parameters.AddWithValue("@First", txt_1_aghaz.Text);
Cmd.Parameters.AddWithValue("@Second", txt_1_payan.Text);
dore1=Convert.ToInt32( Cmd.ExecuteScalar());
Cmd2.Parameters.AddWithValue("@First2", txt_2_aghaz.Text);
Cmd2.Parameters.AddWithValue("@second2", txt_2_payan.Text);
dore2= Convert.ToInt32( Cmd2.ExecuteScalar());
CreateChart(dore1, dore2);
cnn.Close();
當你調用一個函數時,你必須滿足它的返回值。
c# dore1 的代碼
int dore1;
ConnectDb Contact = new ConnectDb();
Contact.connect();
SqlCommand Cmd = new SqlCommand("dore1", cnn);
Cmd.CommandType = CommandType.StoredProcedure;
cnn.Open();
Cmd.Parameters.AddWithValue("@First", txt_1_aghaz.Text);
Cmd.Parameters.AddWithValue("@Second", txt_1_payan.Text);
// setup out parm
var outParm = Cmd.Parameters.Add("@Tedad");
outParm.Direction = ParameterDirection.ReturnValue;
Cmd.ExecuteScalar();
// this is safe as long as select count() returns a number
dore1 = (Int32) outParm.Value;
T-SQL 函數
您有一個特定的日期格式,最接近的日期格式是日本格式 yyyy/mm/dd,即代碼 111。但是 1392 比一年低一些。 這些值在您的表中嗎? sql datetime 格式不處理 1753 之前的日期。如果沒有存儲日期,您可以刪除 convert 語句並恢復為原始 tsql 函數。
ALTER FUNCTION [dbo].[Dore1]
(@First NVARCHAR(50), @second NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @Tedad INT
SET @Tedad = (SELECT COUNT(sh_gharardad)
FROM OrgGharardad
WHERE OrgGhAghdDate
BETWEEN CONVERT(datetime, @First , 111)
AND CONVERT(datetime, @second, 111))
RETURN @Tedad
END
ExecuteScalar 需要 1 列 1 行的結果集,這不是函數返回的結果。 您在標量結果中實際得到的是受影響行的 COUNT 值。
查看有關 procs 和函數之間的差異http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function
你需要做一些事情來選擇函數的結果,以便執行標量工作。
因為你正在處理日期。 確保在將它們發送到 SQL 之前對其進行轉換。
Convert.ToDateTime(txt_1_aghaz.Text.ToString())
並確保您在 SQL 語句中接收日期而不是 nvarchar(50)。
它通過此更改完成: SqlCommand Cmd = new SqlCommand("Select dbo.dore1(@First, @Second)", cnn);
我們不能直接調用函數,它不是存儲過程
完畢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.