此查询会将您暴露给 SQL 注入攻击。您应该将其转换为准备好的语句,但实际错误来自您使用表名 Users。你有 SELECT ... User应该是用户,你没有得到错误的列名错误的原因是因为 User 是一个保留关键字,因此 SQL Server 会给你这个特定的错误,除非你用 [] 分隔表名. 下面的代码应该修复它。
string _query = "SELECT PC.SN, Users.Name + ' ' + Users.Family as AssignedTo FROM PC LEFT JOIN Users ON PC.USERID = Users.ID WHERE PC.Type = @Type";
SqlConnection conn = new SqlConnection("YOUR_CONNECTION_STRING");
SqlCommand cmd = new SqlCommand(_query, connection);
cmd.Parameters.AddWithValue("Type", AssetTypeCB.SelectedItem.Value);
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
如果您的表名实际上是用户,那么此代码将修复错误
string _query = "SELECT PC.SN, [User].Name + ' ' + [User].Family as AssignedTo FROM PC LEFT JOIN [User] ON PC.USERID = [User].ID WHERE PC.Type = @Type";
SqlConnection conn = new SqlConnection("YOUR_CONNECTION_STRING");
SqlCommand cmd = new SqlCommand(_query, connection);
cmd.Parameters.AddWithValue("Type", AssetTypeCB.SelectedItem.ToString());
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
更多关于 SQL 注入攻击
假设 smooene 在您的原始语句中输入了以下值。
'; DELETE FROM Users; --
当您执行 SQL 语句时,SQL Server 会将其解释为:
SELECT PC.SN, User.Name + ' ' + User.Family as AssignedTo
FROM PC LEFT JOIN Users ON PC.USERID = Users.ID
WHERE PC.Type = ''; DELETE FROM Users; --'
该语句是完全有效的,并且考虑到您的用户拥有的权限级别,这可能会从用户表中删除所有记录。使用准备好的语句有助于阻止这种情况的发生。