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
答案 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