【问题标题】:C# MySQL does not recognize inputC# MySQL 不识别输入
【发布时间】:2015-01-19 21:56:28
【问题描述】:

我正在使用本地 MySQL 数据库在 C# Visual Studio 中制作登录表单。但是,每次我输入信息时,它都会告诉我用户名和/或密码不正确,我知道这是错误的。 这是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;


namespace Dark_Heresy
{
    public partial class Form1 : Form
    {
        private MySqlConnection connection = new MySqlConnection();
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btn_Login_Click(object sender, EventArgs e)
        {
            try
            {
                String MyConnection = "datasource = localhost; port = 3306; username = root; password = Mypass;";
                MySqlConnection MyConn = new MySqlConnection(MyConnection);
                MySqlCommand SelectCommand = new MySqlCommand("SELECT * FROM dark_heresy.users WHERE users_='"+ this.TextUserName.Text + "' and password_='"+ this.TextPassword.Text + "';", MyConn);

                MySqlDataReader MyReader;
                MyConn.Open();
                MyReader = SelectCommand.ExecuteReader();
                int count = 0;
                while (MyReader.Read())
                {
                    count = count++;
                }
                if (count == 1)
                {
                    MessageBox.Show("Connection Successful");
                }
                else if (count > 1)
                {
                    MessageBox.Show("Duplication of Username and Password... Access Denied");
                }
                else

                    MessageBox.Show("Incorrect Username and/or Password");
                MyConn.Close();


            }
            catch (Exception exp)
            {
                MessageBox.Show("Error: \r\n" + exp);
            }


        }


        }
    }

在 MySQL 工作台中它可以工作,当进行此查询时,它会向我显示“用户”及其“密码”:

SELECT * FROM dark_heresy.users WHERE users_='admin' and password_='adminpass';

连接工作正常,已经过测试,但总是得到“用户名和/或密码不正确”的结果。

【问题讨论】:

  • 首先要解决的 问题是停止像这样创建 SQL - 改用参数化 SQL。请参阅bobby-tables.com 了解原因。接下来,停止将您的密码以明文形式存储在数据库中。理想情况下,使用其他人编写的身份验证系统...确实没有充分的理由将您自己的身份验证系统放在一起,而且您将用户的安全置于危险之中。
  • 哦,对于需要计算记录数的类似情况,请考虑在查询中使用 COUNT 并使用 ExecuteScalar 来执行它。
  • 如果您不需要计数,只需检查是否存在行,请使用EXISTS
  • @JonSkeet 是的,我知道出于安全原因,我不应该将自己的密码放在一起,我首先使用密码加密的 mysql.user,因为它告诉我密码错误,我认为是因为它试图将其与加密版本进行比较,这就是为什么我刚刚与用户创建了一个“测试”表。出于安全原因,这个想法是回到 mysql.user。

标签: c# mysql visual-studio-2012 database-connection connection-string


【解决方案1】:

除了代码中的更多问题,您的问题是

count = count++;

后缀增量增加count,但返回其先前的值。

string connectionString = "datasource = localhost; port = 3306; username = root; password = Mypass;";
using(MySqlConnection myConn = new MySqlConnection(connectionString))
using(MySqlCommand selectCommand = new MySqlCommand())
{
    selectCommand.CommandText = "SELECT COUNT(1) FROM dark_heresy.users WHERE users_=@User and password_=@Password";
    selectCommand.Connection = myConn;
    selectCommand.Parameters.Add(new MySqlParameter("User", MySqlDbType.VarChar).Value = TextUserName.Text);
    selectCommand.Parameters.Add(new MySqlParameter("Password", MySqlDbType.VarChar).Value = TextPassword.Text);
    myConn.Open();
    var ret = selectCommand.ExecuteScalar();
    var count = Convert.ToInt32(ret);
    if (count == 1)
    {
         MessageBox.Show("Connection Successful");
    }
    else if (count > 1)
    {
         MessageBox.Show("Duplication of Username and Password... Access Denied");
    }
    else
    {
          MessageBox.Show("Incorrect Username and/or Password");
    }  
}

【讨论】:

  • 喜欢:当我尝试您发布的代码时,我得到 18 个错误,例如:名称 'count' 在当前上下文中不存在,并且 selectCommand.Text = "SELECT COUNT(1 ) FROM dark_heresy.users WHERE users_=@User and password_=@Password;");当前上下文中也不存在名称“MysqlType”
  • 我已经清理并重建了项目
  • 呵呵,我的意思是我已经清理和重建,但仍然有同样的错误@HamletHakobyan
  • 确实如此,但它仍然在 "SELECT COUNT(1) FROM mysql.user WHERE users_=@User and password_=@Password;");表示只有 assignment、call、increment、decrement、await 和 new object 表达式可以用作语句。和 TextPassword.Text));说它期望一个;和 Int32.Convert(ret);说'int'不包含'Convert'的定义
  • 新更新。我想我们已经完成了你的代码的调试。但是使用 VS 可以很快完成。
猜你喜欢
  • 2022-09-22
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
相关资源
最近更新 更多