Reputation: 1
I have a function in SQL which returns right answer when execute in SQL Managment this is my Function
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
but when I use it in my c# program, it returns 0 (zero) value in this Code. where did I write wrong ?
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();
Upvotes: 0
Views: 1195
Reputation: 1
it Done by this change : SqlCommand Cmd = new SqlCommand("Select dbo.dore1(@First, @Second)", cnn);
we cant call a function Directly and it is not Stored Procedure
DONE
Upvotes: 0
Reputation: 42453
As you are calling a function you have to cater for its return value.
c# code for 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 Function
You have a specific date format, the one that resembles the closest is the japan format yyyy/mm/dd which is code 111. However 1392 is somewhat low as a year. Are those values in your table? The sql datetime format doesn't handle dates prior to 1753. If no dates are stored you can remove the convert statement and revert to your original tsql function.
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
Upvotes: 2
Reputation: 23
Since you are working with dates. Make sure you convert them before sending them to SQL.
Convert.ToDateTime(txt_1_aghaz.Text.ToString())
and make sure you are receiving Dates in your SQL statement instead of nvarchar(50).
Upvotes: 1
Reputation: 3462
ExecuteScalar is expecting a 1 column, 1 row result set which is not what a function returns. What you are actually getting in the scalar result is the COUNT value of the affected rows.
Check out this about the differences between procs and functions http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function
And you need to do something to SELECT the result of the function for execute scalar to work.
Upvotes: 1