我正在使用db4free.net,服务器很慢,有时会超时而不是连接。我需要知道的是如何禁用或避免错误消息。如果有人知道更好的免费托管网站,将不胜感激。
MySqlCommand cmd = new MySqlCommand();
MySqlDataReader dr;
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Users WHERE USERNAME = '" +
"username" + "'AND PASSWORD = '" + "password" + "'";
dr = cmd.ExecuteReader();
dr.Read();
if (dr.HasRows)
{
}
else
{
}
当我对服务器超时时,错误来自dr = cmd.ExecuteReader();
答案 0 :(得分:2)
1 - 您应该使用参数化查询来避免SQL注入。
2 - 您可以使用try catch块来处理超时。
3 - 您应该将命令放在'using'语句中,因为MySqlCommand实现了IDisposable。
string sql = "SELECT * FROM Users WHERE USERNAME = @username AND PASSWORD = @password";
using (MySqlCommand cmd = new MySqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@password", "password");
cmd.Parameters.AddWithValue("@username", "username");
try
{
MySqlDataReader dr = cmd.ExecuteReader();
}
catch (TimeoutException e)
{
Console.WriteLine(e);
// or whatever you want to do with a timeout
// perhaps retry again or give a message to the user
}
}
答案 1 :(得分:1)
说实话,基于您的代码,您遇到的问题远多于服务器速度。
解决问题的最简单方法是将SqlCommand.CommandTimeout属性设置为大于默认值30秒的值。 0将意味着一个无限期......像120秒这样的东西将远远超过任何用户所能忍受的。
然后你看看命令文本中的串联......只是要求sql注入攻击。
然后你会看到你正在传递密码的事实。充其量这意味着密码具有固定的盐,最糟糕的是它们是纯文本。
您应该使用参数化查询仅基于用户名查询用户记录。应在数据库中索引此字段以提高查询性能。作为注册的一部分,您应该生成一个用户盐,用于散列密码。
检索完盐后,您应该对用户提供的密码进行哈希处理并进行比较。
答案 2 :(得分:0)
使用
cmd.CommandTimeout = int.MaxValue;
答案 3 :(得分:0)
增加命令执行的超时。使用this page更改默认超时。
默认情况下,超时 30秒,这对大多数情况都有好处。您可以将其设置为'0' - 无超时。但是,我建议为您的环境选择一些最佳值。
cmd.CommandTimeout = 300; // Value in seconds