C# 如何在C中调用SQL函数?
我已经在SQL中创建了一个函数,现在我需要在我的C应用程序中使用该函数 我尝试过使用类似的东西,但似乎我做错了,因为我得到:C# 如何在C中调用SQL函数?,c#,sql,sql-server-2008,function,C#,Sql,Sql Server 2008,Function,我已经在SQL中创建了一个函数,现在我需要在我的C应用程序中使用该函数 我尝试过使用类似的东西,但似乎我做错了,因为我得到: Must declare the scalar value '@2064734117' …当我将2064734117作为第一个参数,将1作为第二个参数时。下面是我要说的代码: SqlConnection con = new SqlConnection(clsDb.connectionString); string query = string.Format("selec
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();
我的函数接受两个整数参数并返回一个表。我在VisualStudio中检查了它,它工作了,但我无法让它在我的应用程序中工作
这是我的函数声明:
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*/
您可以这样做:
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的。指定命令参数,即代码段中的select函数,然后使用Fill方法填充数据集。然后,您可以像通常使用标准ado.net那样从行中提取值
如果需要调用存储过程,请查看以下内容:
乍一看,我能看到的第一件事是您没有指定对象所有者/模式;这是函数所必需的,因此应该选择dbo.Function1 第二:看看对string.Format的调用生成了什么;它正在为另一个整数生成@1和@n,但这不是有效的参数名。这很方便,因为 第三:您没有添加任何参数
第四:对于表UDF而不是标量UDF,必须从dbo.Function1…(而不仅仅是选择dbo.Function1…)中选择*
您的SQL有点不正确,应该是:
string query = string.Format("select * from dbo.Function1({0},{1});", int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1);
您可能希望使用SqlParameter对象来防止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;
你犯了什么错误?还有一种选择是编写一个调用函数的存储过程,然后通过ado.net/C调用proc。该代码应该可以工作,它会产生什么错误?请注意,此函数看起来不像函数,最好在存储过程中实现。但是,这两种方法都应该有效。我必须声明标量值'@2064734117'。当我给出2064734117作为第一个参数,1作为第二个参数时,既然它是一个表值函数,那么它不应该是从dbo.Function1{0},{1}中选择*而不是只选择dbo.Function1{0},{1}?