2016-05-23 55 views
0

我刚刚学习c#和sql server。这个问题已被问了几次,但发布的解决方案似乎并没有帮助我。 我有一个名为“LoginInfo”的表,有一个用户的“电子邮件”和“通过”。 在Visual Studio中,我有这种方法,检查一个用户的登录信息“多部分标识符无法绑定”sql,visual studio

private boolean dbQueryLogin(string email, string password) 
    { 
     string com = "SELECT pass FROM LoginInfo WHERE email = [email protected]"; 

     SqlCommand command = new SqlCommand(com, conn); 
     SqlDataReader reader = command.ExecuteReader(); 

     return reader.GetString(0).Equals(password); 
    } 

这保持上引发错误“其他信息:多部分标识符‘XXXX.edu’无法绑定”。 语法看起来很适合我,有什么我失踪?

+0

您打算将电子邮件地址放在引号中:'WHERE email ='XXXXX @ yahoo.com''。但是,更好的解决方案是使用参数化的SQL。 –

+0

开始使用参数化查询,不要请求sql注入 –

回答

2

线索是在错误消息:

多部分标识符“XXXX.edu”不能被约束。

这强烈暗示问题不在于识别您的表 - 它与以“edu”结尾的位相似,该位似乎是电子邮件地址。

立即问题是,你已经忘记引用一个值。 更深的问题是,无论如何你应该使用参数化的SQL,以避免SQL injection attacks,转换问题和不可读的代码。既然你在相同的代码已经给出的值是不一样有什么错误消息,我怀疑你真的有这样的代码:

string sql = "SELECT pass FROM LoginInfo WHERE email = " + email; 

不要那样做。使用参数化的SQL来代替:

private boolean dbQueryLogin(string email, string password) 
{ 
    string sql = "SELECT pass FROM LoginInfo WHERE email = @email"; 
    using (var connection = new SqlConnection(connectionString)) 
    { 
     using (var command = new SqlCommand(sql)) 
     { 
      command.Parameters.Add("@email", SqlDbType.NVarChar).Value = email; 
      using (var reader = command.ExecuteReader()) 
      { 
       // FIXME: What do you want to do if 
       // there are no matches? 
       reader.Read(); 
       return reader.GetString(0) == password; 
      } 
     } 
    } 
} 

这还不是虽好代码:

  • 不要纯文本密码存储在数据库中
  • 处理的情况下没有结果
  • 根本不要建立自己的认证系统;使用由具有更多安全数据经验的人编写的现有文件
+0

没有什么比这个答案更好。 –

+0

这是完美的! – SomeGuyFortune

相关问题