我正在制作登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序时,查询将运行并返回-1值。由于用户名和密码是正确的。请帮帮我。我的程序代码如下:
public partial class Home : System.Web.UI.Page
{
SqlConnection objcon;
String query;
SqlCommand cmd;
int num;
//SqlDataAdapter DataAdapter;
protected void Page_Load(object sender, EventArgs e)//db open in page load.
{
objcon = new SqlConnection("Data Source String");
objcon.Open();
}
//query execution and authentication on button click
protected void Button1_Click(object sender, EventArgs e)
{
query = "select * from tbl_user where UserName='" + txtUname.Text + "' and Password='" + txtPwd.Text + "'";
cmd = new SqlCommand(query,objcon);
num = cmd.ExecuteNonQuery();
//Label3.Text = num.ToString();
if (num == -1)
Label3.Text = "Correct";
else
Label3.Text = "Incorrect";
objcon.Close();
}
}
答案 0 :(得分:5)
看看这段代码:
num = cmd.ExecuteNonQuery();
现在假设您正在基于名为query
的变量创建命令,您是否真的认为使用短语非查询调用方法是否有意义?如果您还不相信,请参阅ExecuteNonQuery
的文档:
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 [...]对于所有其他类型的语句,返回值为-1。
您的陈述是一个SELECT
查询,因此它完全按照文档记录返回-1。
我怀疑你应该使用ExecuteScalar
或ExecuteReader
。例如,如果您尝试获取匹配的数字,则应使用:
SELECT COUNT(*) ... (rest of query, parameterized of course)
就个人而言,我更喜欢按照詹姆斯的回答取得-1或null,但这是一个品味问题。
如果您没有尝试获取匹配数,则不清楚为什么您首先要分配int
变量。
编辑:其他问题:(正如评论中已经提到的)
SqlConnection
,而不是在构造函数using
和SqlConnection
使用SqlCommand
指令,即使出现异常也会关闭答案 1 :(得分:0)
您想要的是执行标量查询,这意味着它返回单个值。如果是您的查询,如果用户名和密码匹配,只需选择-1
:
SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'
如果返回一个值,该值将为-1
,并且您知道您有匹配项。如果没有返回值(null
)则不匹配。
修改强>
除了回答您的问题之外,您还需要解决代码中的一些主要问题:
每次加载页面时都会打开一个新连接。这是一个很大的禁忌!您不仅要在每个页面加载时打开一个新连接,而且在执行查询后也不会关闭连接。
不使用串联来构建查询,而是使用参数化查询来避免SQL注入的风险。甚至对SQL有一点了解的人都可以轻易逃脱您的查询并对您的数据造成严重破坏。