gridview尝试仅显示当前用户的数据时出错

时间:2016-06-02 20:47:40

标签: c# sql-server gridview

C#代码:

string str = "Data Source=(LocalDB)\\MSSQLLocalDB;";
str += "AttachDbFilename=|DataDirectory|DinoData.mdf;";
str += "Integrated Security= True";

SqlConnection c;
c = new SqlConnection(str);

if (Show.Text == "all" || Show.Text == "All" || Show.Text == "all table" || Show.Text == "All table" || Show.Text == "All Table" || string.IsNullOrWhiteSpace(Show.Text))
{
    DataTable dt = new DataTable();

    String req;
    req = "SELECT * FROM [User] Where Username = "+Session["CurentUserid"];

    SqlDataAdapter da = new SqlDataAdapter(req, c);
    da.Fill(dt);

    datagrid.DataSource = dt;
    datagrid.DataBind();
}
else
{
    if (!string.IsNullOrWhiteSpace(Show.Text))
    {
        DataTable dt = new DataTable();

        String req;
        req = Show.Text+ " Where Username = " + Session["CurentUserid"];

        SqlDataAdapter da = new SqlDataAdapter(req, c);
        da.Fill(dt);

        datagrid.DataSource = dt;
        datagrid.DataBind();
    }
}

错误:

  

类型' System.Data.SqlClient.SqlException'的异常发生在   System.Data.dll但未在用户代码中处理

     

其他信息:列名称无效' Niss'。

请帮助,Niss是我的某个用户的ID

1 个答案:

答案 0 :(得分:1)

这是由于不使用参数化查询而导致的经典错误。您忘记将用户名值放在单引号之间,因此您的Niss用户已被混淆为列名

req = "SELECT * FROM [User] Where Username = @user";
SqlDataAdapter da = new SqlDataAdapter(req, c);
da.SelectCommand.Parameters.Add("@user", SqlDbType.NVarChar).Value = Session["CurentUserid"];
da.Fill(dt);

更深入:UserName是一个文本列,因此如果您想在此列中搜索值,则需要将值放在单引号之间。
然而,修复问题添加几个引号

Where Username = '"+Session["CurentUserid"] + "'"

只是更改了问题,因为如果您的用户名中有一个单引号的用户,则再次面临语法错误。唯一正确的方法是使用参数化查询,如我所示。

我将关于Sql Injection的讨论以及您在代码中可能遇到的所有问题留在else部分(您使用整个文本框将查询构建到this well known answer