我的SQL函数有什么问题,当我尝试在C#中检索它的值时,它总是返回null?该函数在SQL设计器中非常可靠,但是当我尝试使用C#运行它时,它失败了。
这是我的功能定义。首先是表值函数:
ALTER FUNCTION dbo.FGetNumberOfChikensInThisDate
(
@Date nvarchar(12),
@IDSource bigint
)
RETURNS Table
AS
RETURN SELECT SUM(NumberOfChicken) AS Number of Chickens
FROM tblChickens
WHERE (SourceID= @IDSource) AND (ReservedDate = @Date)
这是标量值函数:
ALTER FUNCTION dbo.FSGetNumberOfChikensInThisDate
(
@Date nvarchar(12),
@IDSource bigint
)
RETURNS bigint
AS
BEGIN
DECLARE @ret bigint;
SELECT @ret= SUM(NumberOfChicken)
FROM tblChickens
WHERE (ReserveDate = @Date) AND (SourceID= @IDSource)
RETURN @ret;
END;
我使用这两种方法为这些函数创建SQL命令字符串并传递它们的参数并从C#执行它们:对于基于表的函数,我使用:
public static DataTable ExecuteSqlFunction(string functionName, string[] Functionparamers)
{
SqlDataAdapter reader = new SqlDataAdapter();
DataTable table = new DataTable();
string query = "select * from " + functionName + "(";
int index = 0;
foreach (string item in Functionparamers)//{0},{0}
{
query += String.Format("{0}", item);
query += ++index >= Functionparamers.Length ? String.Format(")", item) : ",";
}
if (connection.State != ConnectionState.Open)
{ connection.Open(); }
cmd = new SqlCommand(query, connection);
reader.SelectCommand = cmd;
reader.Fill(table);
connection.Close();
return table;
}
并像这样使用它:
ExecuteSqlFunction("dbo.FGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });
将创建此字符串:
从dbo.FGetNumberOfChikensInThisDate(1391/12 / 01,4)中选择* //日期是波斯语
返回的DataTable对象有一行,但是当我写
时dataTable.Rows[0][0].ToString();
我得到了
“”
字符串,当我在SQL上运行此SQL命令时运行正常! (实际上我尝试在SQL设计器中执行此函数的SQL命令,我得到的结果很好,但是当我尝试使用c#运行它时,它就像这样)。
对于标量值函数,使用相同的前一种方法,最后略有改变:
public static object ExecuteScalarSqlFunction(string functionName, string[] FunctionParameters)
{
string query = "select * from " + functionName + "(";
int index = 0;
object result;
foreach (string item in FunctionParameters)//{0},{0}
{
query += String.Format("{0}", item);
query += ++index >= FunctionParameters.Length ? String.Format(")", item) : ",";
}
if (connection.State != ConnectionState.Open)
{ connection.Open(); }
cmd = new SqlCommand(query, connection);
result = cmd.ExecuteScalar();
connection.Close();
return result;
}
像这样调用这个函数:
ExecuteScalarSqlFunction("dbo.FSGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });
将创建此SQL字符串:
“从dbo.FSGetNumberOfChikensInThisDate(1391/12 / 01,4)中选择*”
当我到达
时result = cmd.ExecuteScalar();
部分会生成一个例外说明:
无效的对象名称'dbo.FSGetNumberOfChikensInThisDate'。 虽然确实存在!并且在那里!。
ExecuteSqlFunction()正在为我的其余功能工作,但这些是失败的异常。 ExecuteScalarFunction没有经过测试,因为我不知道我是否遗漏了任何内容,但我确定处理表值SQL函数的ExecuteSqlFunction是正常的,所以它必须是我在这里缺少的其他内容。
答案 0 :(得分:1)
函数FSGetNumberOfChikensInThisDate
返回标量值 - 类型bigint
的单个结果 - 不能用作SELECT
语句的来源。但是,它可以用作SELECT
语句的列源。
请尝试使用此SQL语句:
SELECT dbo.FSGetNumberOfChikensInThisDate('1391/12/01', 4);
应返回包含单个未命名的BigInt列结果的单行。