如何在 C# 中调用 SQL 函数?
Posted
技术标签:
【中文标题】如何在 C# 中调用 SQL 函数?【英文标题】:How can I call a SQL function in C#? 【发布时间】:2012-08-03 13:17:34 【问题描述】:我在 SQL 中创建了一个函数,现在我需要在我的 C# 应用程序中使用该函数。
我尝试使用类似的东西,但似乎我做错了,因为我得到了:
Must declare the scalar value '@2064734117'
...当我将2064734117
作为第一个参数并将1
作为第二个参数时。这是我正在谈论的代码:
SqlConnection con = new SqlConnection(clsDb.connectionString);
string query = string.Format("select Function1(@0,@1) ",
int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1);
con.Open();
SqlCommand cmd = new SqlCommand(query,con);
SqlDataAdapter READER = new SqlDataAdapter();
READER.SelectCommand = cmd;
DataTable table = new DataTable();
READER.Fill(table);
radGridView1.DataSource = table;
con.Close();
我的函数接受两个整数参数并返回一个表。我在 Visual Studio 中检查了它,它工作正常,但我无法让它在我的应用程序中工作。
这是我的函数声明:
ALTER FUNCTION dbo.Function1
(
/*
@parameter1 int = 5,
@parameter2 datatype
*/
@ID int,
@clsTypeID int
)
RETURNS TABLE/* @table_variable TABLE (column1 datatype, column2 datatype) */
AS
/*BEGIN */
/* INSERT INTO @table_variable
SELECT ... FROM ... */
RETURN SELECT * FROM tblCLASS2
WHERE STNID = @ID AND CLASSTYPEID = @clsTypeID
/*END */
/*GO*/
【问题讨论】:
您遇到了什么错误?还有一种选择是编写一个存储过程来调用你的函数,然后通过 ado.net/c# 调用 proc 这段代码应该可以工作,它给出了什么错误?请注意,此函数看起来不像一个函数,它最好在stored procedure
中实现。但是,它应该以任何一种方式工作。
我得到一个“必须声明标量值'@2064734117'”。当我给 2064734117 作为第一个参数和 1 作为第二个参数时。
既然是表值函数,不应该是select * from dbo.Function1((0,1)
而不仅仅是select dbo.Function1((0,1)
吗?
【参考方案1】:
你的 SQL 有点不对劲,应该是:
string query = string.Format("select * from dbo.Function1(0,1);", int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1);
您可能希望使用 SqlParameter-objects 来防止 sql 注入:
string query = "select * from dbo.Function1(@pa1,@par2);";
cmd.Parameters.Add("@par1", SqlDbType.Int).Value = int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString());
cmd.Parameters.Add("@par2", SqlDbType.Int).Value = 1;
【讨论】:
【参考方案2】:乍一看,我看到的第一件事是您没有指定对象所有者/架构;这是函数所必需的,所以它应该是select dbo.Function1(...
第二:看看你对string.Format
的调用产生了什么;即为 n
另一个整数生成 @1
和 @n
,但这 不是 有效的参数名称。这很方便,因为
第三:你没有添加任何参数
第四:对于表 UDF(而不是标量 UDF),必须select * from dbo.Function1(...
,而不仅仅是select dbo.Function1(...
【讨论】:
【参考方案3】:你可以这样做:
myConn.Open();
//generating the new command for our database
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT OBJECTID_1, NDNT as theAddress, MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) +")) from dbo.DWH_OUTPUT GROUP BY OBJECTID_1,NDNT HAVING (MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) + ")) = (Select MIN(ABS(a.x - " + double.Parse(x.ToString()) + ") + ABS(a.y - " + double.Parse(y.ToString()) + ")) from dbo.DWH_OUTPUT a ) )";
cmd.Connection = myConn;
//getting some more ado.net objects
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();
da.SelectCommand = cmd;
da.Fill(ds, @"Addresses");
if (ds.Tables[0].Rows.Count > 0)
theAddress = ds.Tables[0].Rows[0][@"theAddress"] + @" (proximity address)";
myConn.Close();
请注意,在此示例中,如何将 SqlCommand 的 CommandType 设置为 CommandType.Text
。指定命令参数(即代码 sn-p 中的选择函数),然后使用 Fill
方法填充数据集。然后,您可以像通常使用标准 ado.net 一样从行中提取值。
如果你需要调用一个存储过程,看看这个:
How do I call a TSQL function from ado.net
【讨论】:
【参考方案4】:您需要具有所有者/模式名称的函数的完全限定名称 A working sample available at following link:
【讨论】:
以上是关于如何在 C# 中调用 SQL 函数?的主要内容,如果未能解决你的问题,请参考以下文章