2016-11-18 216 views
0

不知道为什么下面的代码给我一个例外。我试图检查一个用户名是否存在于MySQL数据库中,如果没有,那么我想创建一个用户。如果我自己运行查询,那么它可以正常工作,但不能在一起。检查用户是否存在于MySQL数据库中失败

int valid = -1;    

    using (MySqlConnection cnn = new MySqlConnection(conString)) 
     { 
      cnn.Open(); 

      bool usernameExists = false; 

      string sql1 = String.Format("SELECT Username FROM Users WHERE Username = \"{0}\"", username); 
      MySqlCommand cmd1 = new MySqlCommand(sql1, cnn); 

      usernameExists = (int)cmd1.ExecuteScalar() > 0; 

      if (!usernameExists) 
      { 
       string sql = String.Format("INSERT INTO Users(Username, Password) VALUES(\"{0}\", \"{1}\")", username, password); 
       MySqlCommand cmd = new MySqlCommand(sql, cnn); 

       valid = cmd.ExecuteNonQuery(); 
      } 
     } 
    return valid; 
+0

你用调试器完成了代码吗? –

+0

失败了,究竟是?你有例外吗? – ADyson

+0

该代码位于Web服务上,因此很难调试。 Visual Studio中的异常消息是'System.Reflection.TargetInvocationException' – mosdave

回答

0

我得到它的工作通过改变第一查询:

MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn); 

MySqlCommand cmd1 = new MySqlCommand("SELECT COUNT(UserID) FROM Users WHERE Username = @username", cnn); 
int valid = int.Parse(cmd.ExecuteScalar().ToString()); 

感谢您的帮助。

0

首先,MySQL使用单引号。这意味着您的查询将是:

string.format("SELECT Username FROM Users WHERE Username = '{0}' LIMIT 1", Username); 

但是,这是SQL注入非常脆弱。这里有一个使用MySQL参数来防止它的代码。

int valid = -1;    

using (MySqlConnection cnn = new MySqlConnection(conString)) 
    { 
     cnn.Open(); 

     bool usernameExists = false; 

     MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn); 
     cmd1.Parameters.AddWithValue("@username", username); 

     usernameExists = (int)cmd1.ExecuteScalar() > 0; 

     if (!usernameExists) 
     { 
      MySqlCommand cmd = new MySqlCommand("INSERT INTO Users(Username, Password) VALUES(@username, @password)", cnn); 
      cmd.Parameters.AddWithValue("@username", username); 
      cmd.Parameters.AddWithValue("@password", password); 

      valid = cmd.ExecuteNonQuery(); 
     } 
    } 
return valid; 

你能试试吗?

+0

我得到同样TargetInvocationException。每当我有这个错误之前,它通常是我的SQL中的语法错误,但正如我之前所说,每个查询运行正常,如果我分别运行它们。 – mosdave

+0

你知道哪一行给出了这个错误吗?这样,也许我可以找出错误。很难通过多行修复错误。 –