C# 每次由相同值发送的参数
我正在做一个登录表单,完成后,我发现了一个愚蠢的问题 我输入了一个错误的密码,在我纠正它之后,我又收到了“错误的密码” 我认为这是因为每次执行cmd时,@un和@pw都会得到以前的值,因此我更改了代码以测试我的想法:C# 每次由相同值发送的参数,c#,C#,我正在做一个登录表单,完成后,我发现了一个愚蠢的问题 我输入了一个错误的密码,在我纠正它之后,我又收到了“错误的密码” 我认为这是因为每次执行cmd时,@un和@pw都会得到以前的值,因此我更改了代码以测试我的想法: db.cmd.CommandText = "select count(id) from Users where [username]='"+username+"' and [password]='"+password+"'"; 它仍然有相同的结果 我删除了在输入正确密码后打开新表
db.cmd.CommandText = "select count(id) from Users where [username]='"+username+"' and [password]='"+password+"'";
它仍然有相同的结果我删除了在输入正确密码后打开新表单的密码,所以现在当您在输入正确密码后输入错误密码时,它会说您的密码是正确的:)) 此外,db类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Data.OleDb;
namespace My_Images
{
class Database
{
private string connection_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database.mdb;Jet OLEDB:Database Password=!@~dbpw~@!;";
public OleDbConnection cn;
public OleDbCommand cmd;
public bool connection_error = false;
public string connection_error_reason;
public string _md5(string txt)
{
byte[] A = ASCIIEncoding.ASCII.GetBytes(txt);
byte[] H = MD5CryptoServiceProvider.Create().ComputeHash(A);
return BitConverter.ToString(H).Replace("-", "").ToLower();
}
public Database()
{
try
{
cn = new OleDbConnection(connection_string);
cn.Open();
connection_error = false;
}
catch(Exception e)
{
connection_error = true;
connection_error_reason = e.Message;
}
if (connection_error == false)
{
cmd = new OleDbCommand();
cmd.Connection = cn;
}
}
}
}
首先检查文本框“txt\U密码”的值 您可以向cmd添加参数,如
cmd.Parameters.AddWithValue("@pw", db._md5(password));
啊,现在我明白了,您只需在打开连接后直接创建新的
SqlCommand cmd
。如果第一次尝试出错,则重复使用相同的命令对象。当您两次执行同一命令时(仅更改CommandText
不会使其成为新命令),您可以使用AddWithValue
。但这样做只是将值附加到现有的cmd.Parameters
集合中,而不是替换现有值。你必须做一个测试
cmd.Parameters.Clear();
在添加新值之前。否则SQL server将始终使用提供的前两个参数,这两个参数实际上是您第一次输入的参数,显然是错误的参数。问题不是答案,但如果您广泛使用
AddWithValue
,值得注意。@Liam第二个代码也不起作用。使用调试器并逐步执行代码,检查密码
,\u md5(密码)
的值,并将它们与存储在database@derpirscher是的。数据库中的密码与_md5(Password)具有相同的值!他在第一个问题中回答了。第二个只是一个测试,我只是为第一个写的one@derpirscher问这个问题不是个好地方,但为什么人们对我的问题持否定态度?@mohsennemati你的问题写得不太好。缺少相关部分(例如查询执行或db架构)。你的两个例子对同一个问题做了不同的事情,@derpirscher是的!谢谢
cmd.Parameters.Clear();