C# 每次由相同值发送的参数

C# 每次由相同值发送的参数,c#,C#,我正在做一个登录表单,完成后,我发现了一个愚蠢的问题 我输入了一个错误的密码,在我纠正它之后,我又收到了“错误的密码” 我认为这是因为每次执行cmd时,@un和@pw都会得到以前的值,因此我更改了代码以测试我的想法: db.cmd.CommandText = "select count(id) from Users where [username]='"+username+"' and [password]='"+password+"'"; 它仍然有相同的结果 我删除了在输入正确密码后打开新表

我正在做一个登录表单,完成后,我发现了一个愚蠢的问题

我输入了一个错误的密码,在我纠正它之后,我又收到了“错误的密码”

我认为这是因为每次执行cmd时,@un和@pw都会得到以前的值,因此我更改了代码以测试我的想法:

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();