我一直在asp.net中运行SQL查询错误。我正在使用c#。该错误始终以'(某些字)'附近的错误语法开头。我已检查并重新检查我的代码是否有任何语法错误但从未找到任何..在下面的代码中,错误是'user'附近的错误语法。请帮忙。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
public partial class LogIn : System.Web.UI.Page
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
protected void Page_Load(object sender, EventArgs e)
{
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users \Sony\Documents\Library\App_Data\Library.mdf;Integrated Security=True;User Instance=True";
cmd.Connection=con;
con.Open();
}
protected void txt_user_TextChanged(object sender, EventArgs e)
{
}
protected void txt_pass_TextChanged(object sender, EventArgs e)
{
}
protected void btn_log_Click(object sender, EventArgs e)
{
cmd.CommandText="select count(*) from user where Username='"+txt_user.Text+"' and Password='"+txt_pass.Text+"'";
int count =Convert.ToInt16(cmd.ExecuteScalar());
if (count==1)
{
Response.Redirect("Home.aspx");
}
else
{
Label1.Text="Invalid Username or Password. Please try again..";
}
}
答案 0 :(得分:4)
出错的原因是user
。它是SqlServer的保留关键字
您需要使用方形支架封装它
select count(*) from [user] ....
说,现在让我们解决你的代码中最大的问题。 Sql Injection
cmd.CommandText="select count(*) from [user] where Username=@uname " +
"and Password=@upass";
cmd.Parameters.AddWithValue("@uname", txt_user.Text)
cmd.Parameters.AddWithValue("@upass", txt_pass.Text);
int count =Convert.ToInt16(cmd.ExecuteScalar());
......
使用这样的参数化查询可以保护您的应用程序免受可能危害(或破坏)数据库中存储的信息的恶意输入(请参阅引用的问题)。此外,您还可以避免包含有问题字符的输入问题,例如带单引号或数字小数位分隔符的字符串或日期格式设置困难。
我可以从上面的代码中看到另一个问题。不要将连接存储在全局变量中。如果在需要时打开连接并在之后关闭,则不会影响性能。 它被称为Connection Pooling,当您不使用它时,您不会保留有价值的资源。
总而言之:
protected void btn_log_Click(object sender, EventArgs e)
{
using(SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=" +
@"C:\Users\Sony\Documents\Library\App_Data\Library.mdf;" +
@"Integrated Security=True;User Instance=True")
{
con.Open();
using(SqlCommand cmd = new SqlCommand("select count(*) from [user] where "+
"Username=@uname and Password=@upass", con)
{
cmd.Parameters.AddWithValue("@uname", txt_user.Text)
cmd.Parameters.AddWithValue("@upass", txt_pass.Text);
int count =Convert.ToInt16(cmd.ExecuteScalar());
......
}
}
}
答案 1 :(得分:1)
问题是,“user”是SQL中的保留字。除注入问题外,您的查询应为:
select ... from [user] where
答案 2 :(得分:1)
'用户'是reserved keyword in SQL server。如果您的表名为“user”,则应将其放在查询中的brakets中
select count(*) from [user] where ...
答案 3 :(得分:0)
我完全赞同史蒂夫,罗曼和亚历克斯所说的一切。
如果我应该添加一些东西,那么你应该尽量减少ad-hoc查询的使用,这在本例中已经使用过。相反,您应该更喜欢将sql代码的大部分放在sql函数和存储过程中,因为这样可以提高性能,因为这些查询可以在第一次执行时编译,并且之后执行的时间可以在数据库之后执行专注于审阅数据。使用即席查询时,每次都必须编译查询,这实际上可能需要一些时间来进行更复杂的查询。
然后您可以像这样执行存储过程:
using(SqlCommand cmd = new SqlCommand("dbo.IsValidLogin", con)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@username", txt_user.Text)
cmd.Parameters.AddWithValue("@password", txt_pass.Text);
var isValidLogin =Convert.ToBool(cmd.ExecuteScalar());
...
}
如果您在数据库中声明了如下所示的过程:
CREATE PROC dbo.IsValidLogin
@username nvarchar(50),
@password nvarchar(50)
AS
BEGIN
SELECT count(1)
FROM [user]
WHERE Username=@username
AND Password=@password
END;