【发布时间】:2013-02-19 03:06:55
【问题描述】:
当我尝试在 C# 中检索它的值时,我的 SQL 函数总是返回 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 });
将创建这个字符串:
select * from dbo.FGetNumberOfChikensInThisDate(1391/12/01,4) //日期是波斯语
返回的 DataTable 对象只有一行,但是当我写的时候
dataTable.Rows[0][0].ToString();
我得到一个
""
string 当我在 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 字符串:
"select * from dbo.FSGetNumberOfChikensInThisDate(1391/12/01,4)"
当我到达
result = cmd.ExecuteScalar();
部分它会生成一个异常说:
无效的对象名称“dbo.FSGetNumberOfChikensInThisDate”。 虽然它确实存在!在那里!。
ExecuteSqlFunction() 适用于我的其余功能,但这些是失败的异常。 ExecuteScalarFunction 没有经过测试,因为我不知道我是否遗漏了其中的任何内容,但我确信处理表值 SQL 函数的 ExecuteSqlFunction 是可以的,所以它一定是我在这里遗漏的其他东西。
【问题讨论】:
-
在异常字符串中是一个错字“chiken”。要么这是这里的错字,要么是代码中的某个地方。
-
不,我在那里写了鸡肉,这不是重点
-
您正在连接的用户是否可以访问此功能?从 ADO.NET 连接...不是 SSMS。
-
我想是的,因为如果我无法访问这些功能,我就无法执行一个,而我可以执行其他的,但这两个似乎有问题!
标签: c# sql-server user-defined-functions