请检查我的查询中的错误,我收到“无效的列名称”错误。

时间:2014-01-28 10:51:41

标签: c#

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection("Data Source=HKGROX-PC\\SQLEXPRESS;Initial Catalog=example;Integrated Security=True");
        con.Open();
        string value = DropDownList1.SelectedValue.ToString();

        switch (value)
        {
            case "BJP":
                string s = "select BJP from noofvotes where year= "+ DropDownList2.Text+" and const=" + DropDownList3.SelectedValue + "";
                SqlCommand cmd = new SqlCommand(s,con);
                DataSet ds = new DataSet();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                sda.Fill(ds);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    DataRow dr = ds.Tables[0].Rows[0];
                    TextBox1.Text = dr["BJP"].ToString();
                }
                break;

        }
        con.Close();
    }

这里我收到了无效的列名'Rohini'。我有一个表格,将值提供给列表框。

4 个答案:

答案 0 :(得分:3)

假设你有一个名为YEAR的列和我要添加的CONST,以避免混淆错误

string s = "select BJP from noofvotes where [year]= @yval and [const]=@cval";
SqlCommand cmd = new SqlCommand(s,con);
cmd.Parameters.AddWithValue("@yval",DropDownList2.Text);
cmd.Parameters.AddWithValue("@cval",DropDownList3.SelectedValue);
....

将保留字YEAR括在方括号中将允许将该名称用作列标识符(这实际上是一种不好的做法)。 CONST这个词并没有保留,但我发现它因为众所周知的语言关键词而令人困惑。

上面查询中的另一个问题(肯定是第一个错误的来源)是DrowpDownList3的SelectedValue属性。它插入查询中而不用单引号括起来。如果我想它包含单词Rohini,那么您的原始文本就会变成这样的

string s = "select BJP from noofvotes where year=2014 and const=Rohini";

并且,通过这种方式,该值被视为列名称

同样,将它作为查询的参数应该可以解决问题。

答案 1 :(得分:1)

试试这个

"select BJP from noofvotes where [year] = "+ DropDownList2.Text+" and const=" + DropDownList3.SelectedValue + "";

以下是Keywords的保留Sql Server列表 http://technet.microsoft.com/en-us/library/aa238507%28v=sql.80%29.aspx

答案 2 :(得分:0)

如果你想快速修复,请替换它:

string s = "select BJP from noofvotes where year= "+ DropDownList2.Text+" and const=" + DropDownList3.SelectedValue + "";

有了这个:

string s = "select BJP from noofvotes where [year]= '"+ DropDownList2.Text+"' and const='" + DropDownList3.SelectedValue + "'";

如果您想要更安全的解决方案,请尽可能使用SqlParameter,这样黑客就会远离您的数据库。

string s = "SELECT BJP FROM noofvotes WHERE [year]= @year AND const=@const";
SqlCommand cmd = new SqlCommand(s, con);
cmd.Parameters.AddWithValue("@year", DropDownList2.Text);
cmd.Parameters.AddWithValue("@const", DropDownList3.SelectedValue);

答案 3 :(得分:-1)

如果你的Columns(year& const)是Varchar2类型,那么使用单引号。

string s = "select BJP from noofvotes where year= '"+ DropDownList2.Text+"' and const='" + DropDownList3.SelectedValue + "'";
SqlCommand cmd = new SqlCommand(s,con);

如果Columns(year& const)是数字列,则必须使用如下所示:

string s = "select BJP from noofvotes where year= "+ Convert.ToInt32(DropDownList2.Text)+" and const=" + Convert.ToInt32(DropDownList3.SelectedValue) + "";
SqlCommand cmd = new SqlCommand(s,con);