C# 不同类C中的MySql连接#
好的,我是C#新手,我尝试将Mysql连接字符串移动到另一个类,但调用该方法后,我似乎无法打开连接,我真的看不出有什么问题 这就是一个新类(DatabaseC)中的连接方法 这里我以一种形式调用这个方法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
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
}