C# 不同类C中的MySql连接#

C# 不同类C中的MySql连接#,c#,mysql,C#,Mysql,好的,我是C#新手,我尝试将Mysql连接字符串移动到另一个类,但调用该方法后,我似乎无法打开连接,我真的看不出有什么问题 这就是一个新类(DatabaseC)中的连接方法 这里我以一种形式调用这个方法 private bool validate_login(string u, string p) { DatabaseC.Connection(); MySqlCommand cmd = new MySqlCommand(); cmd.Com

好的,我是C#新手,我尝试将Mysql连接字符串移动到另一个类,但调用该方法后,我似乎无法打开连接,我真的看不出有什么问题

这就是一个新类(DatabaseC)中的连接方法

这里我以一种形式调用这个方法

private bool validate_login(string u, string p)
    {
        DatabaseC.Connection();
        MySqlCommand cmd = new MySqlCommand();
        cmd.CommandText = "SELECT * FROM account WHERE Password COLLATE latin1_general_cs = @password AND User COLLATE latin1_general_cs = @username";
        cmd.Parameters.AddWithValue("@username", u);
        cmd.Parameters.AddWithValue("@password", p);
        MySqlDataReader login = cmd.ExecuteReader();
    }

很抱歉,如果代码看起来不好,但正如我说的,我是新的。

实际上,您需要在使用连接的地方打开连接,请尝试这种方式

public static MySqlConnection Connection()
    {
        try
        {
            ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["cs"];
            string conn = conSettings.ConnectionString;
            MySqlConnection connect = new MySqlConnection(conn);
            return connect;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
然后


您应该返回打开的MySqlConnection的实例

public static MySqlConnection Connection()
{
    ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["cs"];
    string conn = conSettings.ConnectionString;
    MySqlConnection connect = new MySqlConnection(conn);
    connect.Open();
    return connect;
}
现在,您可以更改呼叫代码以接收连接并使用它

private bool validate_login(string u, string p)
{
    using(MySqlConnection cnn = DatabaseC.Connection())
    using(MySqlCommand cmd = cnn.CreateCommand())
    {
        cmd.CommandText = "......"
        ...
        using(MySqlDataReader reader = cmd.ExecuteReader())
        {
           .....
        }  // Here the reader is closed and destroyed
    } // Here the connection closed and destroyed with the command 
}
请注意,连接是一个一次性对象,因此您应该确保在使用完毕后将其销毁。这是using语句的工作

此代码修复的另一个问题是,命令需要知道要使用的连接,实际代码没有将命令与连接链接,因此无法工作


编辑:下面的评论应添加到答案中。应删除连接方法中的Try/Catch。您在那里什么也不做,捕获异常只会在需要处理null返回值的调用代码中造成复杂性。最好让异常冒泡出来,直到有一种方法与此相关(例如,记录它)

您忘记了使用连接变量,而且连接变量也不以明文形式存储用户密码!很高兴初学者知道参数化sql@DanielA.White如果它在服务器端,那么是谁cares@Steve是的。。。。这就是为什么我们有https。@Steve没有https用于加密整个请求/响应路径。证书提供了方程式中预期的聚会部分。谢谢史蒂夫!这个解决方案非常有效。但是try-catch之外需要的其他返回值呢?我应该把它设为null吗?嗯,不,在这个异常中你什么也不做,最好删除try/catch,让调用方处理它
public static MySqlConnection Connection()
{
    ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["cs"];
    string conn = conSettings.ConnectionString;
    MySqlConnection connect = new MySqlConnection(conn);
    connect.Open();
    return connect;
}
private bool validate_login(string u, string p)
{
    using(MySqlConnection cnn = DatabaseC.Connection())
    using(MySqlCommand cmd = cnn.CreateCommand())
    {
        cmd.CommandText = "......"
        ...
        using(MySqlDataReader reader = cmd.ExecuteReader())
        {
           .....
        }  // Here the reader is closed and destroyed
    } // Here the connection closed and destroyed with the command 
}