C# 从数据库中获取-1值
我正在做一个登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序时,查询将运行并返回-1值。因为用户名和密码是正确的。请帮帮我。我的程序代码如下:C# 从数据库中获取-1值,c#,C#,我正在做一个登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序时,查询将运行并返回-1值。因为用户名和密码是正确的。请帮帮我。我的程序代码如下: public partial class Home : System.Web.UI.Page { SqlConnection objcon; String query; SqlCommand cmd; int num; //SqlDataAdapter DataAdapter; protect
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();
}
}
请看以下代码:
num = cmd.ExecuteNonQuery();
现在,假设您正在基于名为query
的变量创建一个命令,那么您真的认为使用短语non-query调用一个方法有意义吗?如果您还不确定,请参阅以下文档:
对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。[…]对于所有其他类型的语句,返回值为-1
您的语句是一个SELECT
查询,因此它返回的是-1,与文档中描述的完全一样
我怀疑你应该使用或。例如,如果您试图获取匹配数,则应使用:
SELECT COUNT(*) ... (rest of query, parameterized of course)
就我个人而言,根据詹姆斯的回答,我更喜欢接受-1或空值,但这是一个品味的问题
如果您没有尝试获取匹配的计数,那么首先就不清楚为什么要分配给int
变量
编辑:其他问题:(如评论中所述)
- 仅在需要时创建并打开
,而不是在构造函数中SqlConnection
- 对
和SqlConnection
使用SqlCommand
指令,即使出现异常,它们也会关闭using
- 不要在SQL中直接包含用户输入-改用参数化SQL,以避免SQL注入攻击,改进代码/数据分离,并避免转换错误
- 不要将用户密码直接以明文形式存储在数据库中——这对于任何网站来说都是一件非常可怕的事情
- 首先不要尝试编写自己的用户身份验证代码-在许多不同的地方,您已经完成了这项工作
num = cmd.ExecuteNonQuery();
现在,假设您正在基于名为query
的变量创建一个命令,那么您真的认为使用短语non-query调用一个方法有意义吗?如果您还不确定,请参阅以下文档:
对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。[…]对于所有其他类型的语句,返回值为-1
您的语句是一个SELECT
查询,因此它返回的是-1,与文档中描述的完全一样
我怀疑你应该使用或。例如,如果您试图获取匹配数,则应使用:
SELECT COUNT(*) ... (rest of query, parameterized of course)
就我个人而言,根据詹姆斯的回答,我更喜欢接受-1或空值,但这是一个品味的问题
如果您没有尝试获取匹配的计数,那么首先就不清楚为什么要分配给int
变量
编辑:其他问题:(如评论中所述)
- 仅在需要时创建并打开
,而不是在构造函数中SqlConnection
- 对
和SqlConnection
使用SqlCommand
指令,即使出现异常,它们也会关闭using
- 不要在SQL中直接包含用户输入-改用参数化SQL,以避免SQL注入攻击,改进代码/数据分离,并避免转换错误
- 不要将用户密码直接以明文形式存储在数据库中——这对于任何网站来说都是一件非常可怕的事情
- 首先不要尝试编写自己的用户身份验证代码-在许多不同的地方,您已经完成了这项工作
-1
:
SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'
如果返回值,则该值将为-1
,并且您知道您有一个匹配项。如果未返回任何值(null
),则该值不匹配
编辑
除了回答您的问题外,您还需要解决代码中的一些主要问题:
您想要的是执行一个标量查询,这意味着它返回一个值。在您的查询中,如果用户名和密码匹配,只需选择
-1
:
SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'
如果返回值,则该值将为-1
,并且您知道您有一个匹配项。如果未返回任何值(null
),则该值不匹配
编辑
除了回答您的问题外,您还需要解决代码中的一些主要问题:
警告:您的代码很容易受到sql注入攻击。此外,您永远不应未加密地存储用户密码。您的url是什么?[呵呵-受前两条评论的启发]在投入生产之前,请先阅读本文。然后访问OWASP网站,浏览他们的前10名。更好