如何使用C#连接Mysql?

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;
    }    
}

*我希望能得到你的反馈。 :)


2
你的系统存在SQL注入漏洞。 - SLaks
不要以明文形式存储密码。 - SLaks
发布完整的连接字符串(当然要删除密码)。 - Adam Schiavone
如果您正在尝试为数据库生成CRUD访问的Web界面,请考虑使用ASP.NET Dynamic Data。 http://msdn.microsoft.com/zh-cn/library/ee845452(v=vs.100).aspx - Aron
连接字符串是什么? - user2059513
显示剩余3条评论
3个回答

17

你的直接问题可能是错误的连接字符串或数据库服务器不可用。连接字符串应该是这样的:

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

请用您的实际值替换<username><password>.

此外,您的代码存在若干问题,如果打算将其用于生产环境,或者仅仅是为了学习一些东西而进行的玩具项目,那么您肯定应该认真考虑并解决这些问题。以下是问题列表,按照重要性排序,但可能不完全。

  1. 不要硬编码您的连接字符串。相反,请将它移到配置文件中。
  2. 不要在配置文件或源代码中包含明文密码。有各种解决方案,例如Windows身份验证、证书Windows数据保护API保护的密码。
  3. 不要只是通过调用IDisposable.Dispose()来处理IDisposable实例。相反,请使用using语句释放资源,即使出现异常也会释放。
  4. 不要使用字符串操作技术构建SQL语句。相反,请使用SqlParameter来防止SQL注入攻击。
  5. 不要在数据库中存储明文密码。相反,至少存储这些密码的盐散哈希,并使用缓慢的哈希函数,而不是MD5或SHA家族的成员。
  6. 您可以使用IDbCommand.ExecuteScalar来检索标量结果,从而避免使用数据读取器。
  7. 将布尔值与truefalse进行比较是多余的,只会增加代码的噪声。例如,if (reader.IsDBNull(0) == true)可以简写为if (reader.IsDBNull(0))。同样适用于if (reader.Read() != false)等价于if (reader.Read() == true),因此也是if (reader.Read())
  8. 使用对象关系映射器(O/R mapper),如Entity Framework,通常优于在SQL命令级别上与数据库交互。

2

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
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接