【问题标题】:WebMethod throws "Incorrect syntax near '='"WebMethod 抛出“'=' 附近的语法不正确”
【发布时间】:2015-07-27 05:26:52
【问题描述】:

我在这一行遇到错误: using (SqlDataReader reader =cmd.ExecuteReader())

我正在研究 ASP.Net 中的 AJAX 级联下拉示例,下面是我的代码。由于错误,我无法运行代码

“=”附近的语法不正确。附近使用 (SqlDataReader reader =cmd.ExecuteReader())

代码

 [WebMethod]
public AjaxControlToolkit.CascadingDropDownNameValue[] GetDropDownCountry1(string knownCategoryValues)
{
   // select CountryId, Country from Country where Status='Active'
   // string query = "SELECT Country, CountryId FROM Country";
    string query = "select [CountryName], [CountryId] from Countries";
    List<AjaxControlToolkit.CascadingDropDownNameValue> countries = GetData(query);
    return countries.ToArray();
}

private List<AjaxControlToolkit.CascadingDropDownNameValue> GetData(string query)
{
    string conString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    SqlCommand cmd = new SqlCommand(query);
    List<AjaxControlToolkit.CascadingDropDownNameValue> values = new List<AjaxControlToolkit.CascadingDropDownNameValue>();
    using (SqlConnection con = new SqlConnection(conString))
    {
        con.Open();
        cmd.Connection = con;
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
            {
                values.Add(new AjaxControlToolkit.CascadingDropDownNameValue
                {
                    name = reader[0].ToString(),
                    value = reader[1].ToString()
                });
            }
            reader.Close();
            con.Close();
            return values;
        }
    }
}

【问题讨论】:

  • CountryIdStateId 如何存储在数据库中?作为intVARCHAR?
  • 我建议运行SQL Profiler 看看生成的查询有什么问题。
  • 或打印您的query 并针对 sql server 运行它
  • CountryId 和 StateId 为 int 格式。 @ughai
  • 将“{0}”填入国家和下一个州和城市的值将不会加载。 @ughai

标签: c# sql asp.net sql-server web-services


【解决方案1】:
string state = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)["StateId"];
string query = string.Format("select [CityName], [CityId] FROM Cities where StateId = {0}", state);

如果 state 是类似“CA”的字符串,那么这将生成 SQL 语句“select [CityName], [CityId] FROM Cities where StateId = CA”,这是无效的。作为字符串传递的值需要被引用。但不要只在 "{0}" 周围加上引号 - 正确的解决方法是使用参数化查询并将 StateId 作为参数传递。比如:

string sql = "select [CityName], [CityId] FROM Cities where StateId = @stateId"
cmd.Parameters.Add("stateId", stateId);

这样更有效,可以保护您免受SQL injection 的侵害。

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 2015-12-12
    • 1970-01-01
    • 2014-11-29
    • 2013-12-16
    • 1970-01-01
    • 2018-08-14
    • 2011-03-11
    • 2014-02-16
    相关资源
    最近更新 更多