有一个sql语句c#的问题

时间:2017-03-16 20:54:58

标签: c# mysql sql

我正在使用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();

4 个答案:

答案 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