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