【问题标题】:How to connect to Mysql using C#?如何使用 C# 连接到 Mysql?
【发布时间】:2013-02-10 19:55:12
【问题描述】:

我只是 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;
    }    
}

*希望得到您的反馈。 :)

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • 不要以纯文本形式存储密码。
  • 发布整个连接字符串(当然要修改密码)
  • 如果您尝试生成用于 CRUD 访问数据库的 Web 界面,请考虑使用 ASP.NET 动态数据。 msdn.microsoft.com/en-us/library/ee845452(v=vs.100).aspx
  • @AdamSchiavone 连接字符串是什么?

标签: c# mysql


【解决方案1】:

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

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

&lt;username&gt;&lt;password&gt; 替换为您的实际值。

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

  1. 不要对连接字符串进行硬编码。 Instead move it to a configuration file.
  2. 不要在配置文件或源代码中包含纯文本密码。 Windows Data Protection API 有多种解决方案,例如 windows authentication, certificatespasswords protected
  3. 不要仅仅通过调用IDisposable.Dispose() 来处理IDisposable 实例。 Instead use the using statement to release resources even in the case of exceptions.
  4. 不要使用字符串操作技术构建 SQL 语句。 Instead use SqlParameter to prevent SQL injection attacks.
  5. 不要将纯文本密码存储在数据库中。 Instead at least store salted hashes of the passwords and use a slow hash function, not MD5 or a member of the SHA family.
  6. 您可以使用IDbCommand.ExecuteScalar 检索标量结果并避免使用数据读取器。
  7. 将布尔值与truefalse 进行比较是多余的,只会给代码增加噪音。您可以使用if (reader.IsDBNull(0)) 而不是if (reader.IsDBNull(0) == true)if (reader.Read() != false) 同样适用于 if (reader.Read() == true),因此也适用于 if (reader.Read())
  8. 使用像Entity Framework 这样的 O/R 映射器通常比在 SQL 命令级别与数据库交互要好。

【讨论】:

    【解决方案2】:

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

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

    来源: MySQL ConnectionStrings

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

    Creating a Connector/Net Connection String (MYSQL)

    【讨论】:

      【解决方案3】:

      简单无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-10-21
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 2013-03-19
        • 1970-01-01
        相关资源
        最近更新 更多