3

我只是 C# 的初学者。我将 XAMPP 服务器用于 MySQL 数据库和 Visual C# 2010。然后我在 phpMyAdmin 中创建了一个名为“testdb”的数据库和一个名为“login”的表。我已经在表格中插入了我的用户名和密码。我正在做一个简单的 WinForm 登录,其中我为用户名和密码以及一个按钮制作了两个文本框。我已经完成了我的代码,并且没有编译器错误。但是我在一行中遇到了麻烦。它说“无法连接到任何指定的 MySQL 主机”。我将 MySql.Data 添加到我的参考资料中。我想在登录的时候取数据库表中的数据,然后给用户授权或者不匹配会提示错误信息。

这是我的代码:

using MySql.Data.MySqlClient; 

public bool Login(string username, string password)
{
    MySqlConnection con = new MySqlConnection("host=localhost;username…");
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM login WHERE username='" +
                                      username + "' AND password='" + password + "';");

    cmd.Connection = con;

    con.Open(); // This is the line producing the error.

    MySqlDataReader reader = cmd.ExecuteReader();

    if (reader.Read() != false)
    {    
        if (reader.IsDBNull(0) == true)
        {
            cmd.Connection.Close();
            reader.Dispose();
            cmd.Dispose();
            return false;
        }    
        else
        {
            cmd.Connection.Close();
            reader.Dispose();
            cmd.Dispose();
            return true;
        }    
    }    
    else
    {
        return false;
    }    
}

*我希望您的反馈。:)

4

3 回答 3

17

您的直接问题可能是连接字符串不正确或数据库服务器不可用。连接字符串应该是这样的

Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;

并替换为您的实际值<username><password>

除此之外,您的代码还有几个问题,如果它打算成为生产代码,即使这只是一个学习一些东西的玩具项目,您也绝对应该研究它们。该列表按特定顺序排列,可能并不全面。

  1. 不要对连接字符串进行硬编码。而是将其移动到配置文件中。
  2. 不要在配置文件或源代码中包含纯文本密码。有多种解决方案,如Windows 身份验证、证书或受Windows 数据保护 API保护的密码
  3. 不要仅仅IDisposable通过调用来处理实例IDisposable.Dispose()而是使用该using语句来释放资源,即使在出现异常的情况下也是如此。
  4. 不要使用字符串操作技术构建 SQL 语句。而是用于SqlParameter防止 SQL 注入攻击。
  5. 不要将纯文本密码存储在数据库中。相反,至少存储密码的加盐哈希并使用慢速哈希函数,而不是 MD5 或 SHA 系列的成员。
  6. 您可以使用IDbCommand.ExecuteScalar来检索标量结果并避免使用数据读取器。
  7. 将布尔值与trueor进行比较false是多余的,只会给您的代码添加噪音。而不是if (reader.IsDBNull(0) == true)你可以只使用if (reader.IsDBNull(0)). 这同样适用于if (reader.Read() != false)等价于if (reader.Read() == true)and 因此也if (reader.Read())
  8. 使用像实体框架这样的 O/R 映射器通常比在 SQL 命令级别上与数据库交互更受欢迎。
于 2013-02-11T03:19:07.163 回答
2

尝试根据标准 MySQL ConnectionString 修改您的 ConnectionString:

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

资料来源: MySQL 连接字符串

您还可以查看以下链接,该链接显示了如何使用 C# 连接到 MySQL 数据库:

创建连接器/网络连接字符串 (MYSQL)

于 2013-02-10T20:22:21.843 回答
0

让它变得简单且无 sql 注入,并且不要忘记在您的引用中添加MySql.Web ,因为您使用XAMPP

        public bool Login(string username, string password)
        {
            DataTable dt = new DataTable();
            string config = "server=....";
            using (var con = new MySqlConnection { ConnectionString = config })
            {
                using (var command = new MySqlCommand { Connection = con })
                {
                    con.Open();
                    command.CommandText = @"SELECT * FROM login WHERE username=@username AND password=@password";
                    command.Parameters.AddWithValue("@username", username);
                    command.Parameters.AddWithValue("@password", password);
                    dt.Load(command.ExecuteReader());
                    if (dt.Rows.Count > 0)
                        return true;
                    else
                        return false;

                } // Close and Dispose command

            } // Close and Dispose connection
        }
于 2017-08-30T01:00:09.447 回答