7

我在 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*/
4

4 回答 4

12

你的 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;
于 2012-08-03T13:25:43.960 回答
4

乍一看,我首先看到的是您没有指定对象所有者/模式;这是功能所必需的,所以它应该是select dbo.Function1(...

第二:看看你的调用string.Format产生了什么;那是为另一个整数生成@1和,但这不是一个有效的参数名称。这很方便,因为@nn

第三:你没有添加任何参数

第四:对于表 UDF(而不是标量 UDF),您必须select * from dbo.Function1(...,而不仅仅是select dbo.Function1(...

于 2012-08-03T13:24:38.110 回答
1

你可以这样做:

        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. 指定您的命令参数(即代码片段中的选择函数),然后使用该Fill方法填充数据集。然后,您可以像通常使用标准 ado.net 一样从行中提取值。

如果您需要调用存储过程,请查看以下内容:

如何从 ado.net 调用 TSQL 函数

于 2012-08-03T13:23:39.590 回答
1

您需要具有所有者/模式名称的函数的完全限定名称 以下链接提供的工作示例:

于 2012-08-03T13:24:40.210 回答