在C#中选择mysql数据库单元

时间:2019-03-03 20:16:35

标签: c# mysql unity3d

即时通讯试图做的是选择一个我的用户名所在的单元格,并将密码与在统一c#中完成的文本进行比较,但是即时通讯使用Mysql Reference,它应该像任何类型的c#。现在我试图在vb中做类似的事情,当您在阅读器中读取值时,它将在vb中看起来像这样 rdr(0),但我似乎无法在C#中执行此操作,这是我的代码。对于任何担心密码会流到哪里的人,我计划稍后再添加加密。

void Login_Data(string un, string pw) {
        con = new MySqlConnection(connectionString);
        con.Open();
        Debug.Log("Mysql state: " + con.State);

        string sql = "SELECT * FROM `users` WHERE '" + un + "'";
        cmd = new MySqlCommand(sql, con);
        rdr = cmd.ExecuteReader();

        while (rdr.Read()) {
                if (rdr[3] == pw) // this is the problem it keeps warning 
//me i like my stuff clean but i dont risk errors if (rdr[3] == pw) also 
//it did give me an error but not here.

                {
                    username = un;
                    MessageBox.Show(username + ", Has Logged in!", "API");
                    usertext.text = "User: " + username;
                    m_uid.text = "UserID: " + rdr.GetString("uid");
                }
        }
}

警告CS0252可能的非预期参考比较;要进行值比较,请将左侧的文字键入“ string”

我不了解此警告,也不知道为什么发生

2 个答案:

答案 0 :(得分:0)

这里是单行修复:

.... if (rdr[3].ToString() == pw).....

出现错误的原因是因为您正在将数据单元与数据类型进行比较...

但是让我们学点更多吧?

首先,您的SQL语句没有任何意义。让我们来看一下:

"SELECT * FROM `users` WHERE '" + un + "'"

因此,您正在使用Where子句。让我们谈谈一般语法。当我们使用与WH相关的任何单词时,我们是否应该提供有关某物的信息?就像,你不能只说:

  

布莱恩去了新泽西州……

相反,您可以说:

  

Brian去了新泽西州,在那里他留下了浏览器cookie。

相同的规则适用于SQL语句。当您使用Where子句时,实际上是在检查某些值是否与给定值匹配。...

这是Where语句的正确用法:

Select * From Table Where Column1 = 'Some Value'

继续...

您在这里使用IDataReader,这几乎是不必要的。为什么不只比较SQL语句本身中的所有值?只需使用AND进行多次比较...

正如您提到的,您正在将用户名和密码存储在数据库中。最佳做法是存储用户名和密码的哈希。为此,您可以选择很多选项,例如 Argon2,bcrypt,scrypt或PBKDF2

最后但并非最不重要的是,您的代码最大的问题是以下行:

MessageBox.Show(username + ", Has Logged in!", "API");

经过多年的努力,开发人员带来了诸如MVVM之类的模式,以实现可伸缩性,性能以及其他方面。那你为什么生活在17世纪?永远记住:

  

您将花费20%的时间编写代码,并花费80%的时间维护代码。

因此,请勿在UI线程本身中编写此类与UI相关的代码。如果您熟悉MVVM模式,您已经知道我在说什么...

无论如何,希望您能学到一些...如果我在某个地方出错,请随时进行纠正。 Kapeesh?

答案 1 :(得分:0)

我现在知道,如果(rdr [3] == pw)

,就不能这样包含像pw.Equals(rdr [3])这样的字符串。
void Login_Data(string un, string pw) {
    try {

        con = new MySqlConnection(connectionString);
        con.Open();
        Debug.Log("Mysql state: " + con.State);

        string sql = "SELECT * FROM `users` WHERE uname='" + un + "'";
        cmd = new MySqlCommand(sql, con);
        rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
                if (pw.Equals(rdr[3]))
                {
                    username = un;
                    MessageBox.Show(username + ", Has Logged in!", "API");
                    usertext.text = "User: " + username;
                    m_uid.text = "UserID: " + rdr.GetString("uid");
                }
        }
 }

感谢draco18s和zack raiyan,他们给了我一些新知识。