C# 必须声明标量变量/已声明的变量

C# 必须声明标量变量/已声明的变量,c#,C#,我试图创建一个函数,它接受一个查询及其参数,并返回一个SQLDataSource以进行进一步绑定 功能是: public static SqlDataSource getSqlSource(string sql, Dictionary<string, string> parameters) { SqlConnection con = new SqlConnection(ConnectionString); using (SqlCommand

我试图创建一个函数,它接受一个查询及其参数,并返回一个SQLDataSource以进行进一步绑定

功能是:

 public static SqlDataSource getSqlSource(string sql, Dictionary<string, string> parameters)
    {
        SqlConnection con = new SqlConnection(ConnectionString);

        using (SqlCommand cmd = con.CreateCommand())
        {
            con.Open();
            cmd.CommandText = sql;
            foreach (KeyValuePair<string, string> item in parameters)
            {
                 
                cmd.Parameters.Add(new SqlParameter(item.Key, item.Value));

            }
            SqlDataSource source = new SqlDataSource(ConnectionString, cmd.CommandText);

            con.Close();

            return source;
        }
    }
它工作正常,但我希望避免可能的Sql注入,如果我声明如下:

DECLARE @return_value int  EXEC @return_value = [dbo].[ProcedureName]  @from =@saledate 
把销售日期作为一项放在我的字典里我仍然有错误

必须声明变量@saledate


此处的
cmd.ExecuteReader()
位置不正确:

        foreach (KeyValuePair<string, string> item in parameters)
        {

            cmd.Parameters.Add(new SqlParameter(item.Key, item.Value));

            cmd.ExecuteReader();

        }
foreach(参数中的KeyValuePair项)
{
cmd.Parameters.Add(新的SqlParameter(item.Key,item.Value));
cmd.ExecuteReader();
}
我认为这应该是这样的:

        foreach (KeyValuePair<string, string> item in parameters)
        {

            cmd.Parameters.Add(new SqlParameter(item.Key, item.Value));

        }
        cmd.ExecuteReader();
foreach(参数中的KeyValuePair项)
{
cmd.Parameters.Add(新的SqlParameter(item.Key,item.Value));
}
cmd.ExecuteReader();

经过一段时间的研究,我改变了以下功能:

 public static SqlDataSource getSqlSource(string sql,  Dictionary<string, string> parameters)
 {
     SqlConnection con = new SqlConnection(ConnectionString); 
     SqlDataSource source = new SqlDataSource(ConnectionString, sql);

     foreach (KeyValuePair<string,string> pair in parameters)
     {

         source.SelectParameters.Add(pair.Key, pair.Value);
     }

     return source;
 }
publicstaticsqldatasourcegetsqlsource(字符串sql,字典参数)
{
SqlConnection con=新的SqlConnection(ConnectionString);
SqlDataSource source=新的SqlDataSource(ConnectionString,sql);
foreach(参数中的KeyValuePair对)
{
source.SelectParameters.Add(pair.Key,pair.Value);
}
返回源;
}
在代码隐藏中声明字典时,不应使用“@”字符声明关键项,“@”字符只能在查询中声明,因此声明为:

  Dictionary<String, String> Params = new Dictionary<String, String>();
    Params.Add("from", from);
Dictionary Params=newdictionary();
参数添加(“起始”,起始);
采纳的建议
谢谢大家的帮助:)

您声明“@saleDate”不是“@from”(这是行//”declare@saleDate;“+)@sabinbio谢谢您指出这一点。然而,即使我将其声明为“@from”,它仍然给我带来了同样的问题:(.我编辑了question@Ange1-这个问题对于dba.stackexchange.com来说是离题的-它将自动移动到StackOverflow.ok@MaxVernon感谢您指出:)如果从日期中删除
declare@会发生什么完全来自字符串?仍然是相同的问题。因为我只需要返回数据源,所以我尝试删除cmd.ExecuteReader(),但在本例中,它不返回任何值。如果是相同的问题,您能帮助输出:MessageBox.Show(sql.ToString());查看您传递的文本
        foreach (KeyValuePair<string, string> item in parameters)
        {

            cmd.Parameters.Add(new SqlParameter(item.Key, item.Value));

        }
        cmd.ExecuteReader();
 public static SqlDataSource getSqlSource(string sql,  Dictionary<string, string> parameters)
 {
     SqlConnection con = new SqlConnection(ConnectionString); 
     SqlDataSource source = new SqlDataSource(ConnectionString, sql);

     foreach (KeyValuePair<string,string> pair in parameters)
     {

         source.SelectParameters.Add(pair.Key, pair.Value);
     }

     return source;
 }
  Dictionary<String, String> Params = new Dictionary<String, String>();
    Params.Add("from", from);