登录时获取特定列的值(C# Mysql)

Posted

技术标签:

【中文标题】登录时获取特定列的值(C# Mysql)【英文标题】:Get Value of specific Column while Login (C# Mysql) 【发布时间】:2020-05-14 13:36:46 【问题描述】:

我现在正在尝试登录。我看了一些视频,找到了一个好方法。每个用户都有一个 ID、用户名和密码。我想获取刚刚登录的用户的 id 并将其保存为 Integer。我也尝试了ExecuteReader,但我得到了一个异常(mysql.Data.MySqlClient.MySqlException)。

我当前的代码是:

 try
            
                if (sqlCon.State == ConnectionState.Closed)
                
                    sqlCon.Open();
                
                string query = "SELECT COUNT(1) FROM Users_Table WHERE Username=@Username AND Password=@Password;";
                MySqlCommand sqlCmd = new MySqlCommand(query, sqlCon);
                sqlCmd.Parameters.AddWithValue("@Username", maintxtbox1.Text);
                sqlCmd.Parameters.AddWithValue("@Password", Hashed_Password);
                int count = Convert.ToInt32(sqlCmd.ExecuteScalar());
                if (count == 1)
                
                    //Login correct
                
                else
                
                    //Login incorrect
                
            
            catch
            
                //Exception
            
            finally
            
                sqlCon.Close();
            

ExecuteReader 的尝试:

try
            
                if (sqlCon.State == ConnectionState.Closed)
                
                    sqlCon.Open();
                
                string query = "SELECT id,Username,Password FROM Users_Table WHERE Username=@Username AND Password=@Password;";
                MySqlCommand sqlCmd = new MySqlCommand(query, sqlCon);
                sqlCmd.Parameters.AddWithValue("@Username", maintxtbox1.Text);
                sqlCmd.Parameters.AddWithValue("@Password", Hashed_Password);

                MySqlDataReader datareader = sqlCmd.ExecuteReader();

                if (datareader.HasRows)
                
                    MessageBox.Show("Test: " + datareader.GetString("id"));
                
                else
                
                    //Login incorrect
                
            
            catch
            
                //Exception
            
            finally
            
                sqlCon.Close();
            

我希望有人可以帮助我。提前谢谢你。

【问题讨论】:

string query = "SELECT COUNT(1) FROM Users_Table WHERE Username=@Username AND Password=@Password;"; 你为什么要计算这样的查询的结果数?如果有匹配的结果,您是否希望得到 1 作为结果? 【参考方案1】:

尝试使用读取方法:

if(datareader.Read())
    MessageBox.Show("Test: "+datareader.GetString(0));

编辑: 为了充分利用和处置资源,我建议在 using 块中使用 MySqlDataReader,例如

using(MySqlDataReader reader = new sqlCmd.ExecuteReader())
    if(reader.Read())
        MessageBox.Show("Test: "+reader.GetString(0));
    

【讨论】:

如果您想遍历多个结果,也可以使用while( reader.Read() ) ... 您好,感谢您的回答。我在上面的代码 sn-p 中使用 DataReader 进行了尝试,但它只有一个异常我也尝试使用 reader.GetString(0) 而不是 reader.GetString("id"),但它不起作用。我不能使用while,因为我需要刚刚登录的用户的ID,而不是每个ID。你知道我可以如何修复异常或者你有另一个解决方案吗?提前致谢【参考方案2】:

我自己找到了我的问题的解决方案。我在ìf(datareader.HasRows) 查询中忘记了while(datareader.Read())。这是我的工作代码:

try
            
                if (sqlCon.State == ConnectionState.Closed)
                
                    sqlCon.Open();
                
                string query = "SELECT * FROM Users_Table WHERE username=@Username AND password=@Password;";
                MySqlCommand sqlCmd = new MySqlCommand(query, sqlCon);
                sqlCmd.Parameters.AddWithValue("@Username", maintxtbox1.Text);
                sqlCmd.Parameters.AddWithValue("@Password", Hashed_Password);
                MySqlDataReader datareader = sqlCmd.ExecuteReader();
                if (datareader.HasRows)
                
                    while (datareader.Read())
                    
                        UserID = datareader.GetInt32("id");
                    
                
                else
                
                    //Incorrect Password
                

            
            catch
            
                //Error
            
            finally
            
                sqlCon.Close();
            

【讨论】:

以上是关于登录时获取特定列的值(C# Mysql)的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查询以获取特定列的值的最后更改

C# 获取datatable某一列的值

如何在RowDataBound函数中获取特定列的值?

如何从C#中获取ListView中选中某一行某一列的值

DataRow在c#中获取连接表的重复列的值

我想获取位于两个特定列之间的列的值