C# 登录屏幕 - 在 SQL 表中查找用户并更新字段

标签 c# sql sql-server

我目前正在编写一个小型应用程序来跟踪货币的来龙去脉,这只是为了提高我的一般 C# 技能。对于我的登录屏幕,我目前有以下代码

    private void Login_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'spendingInsAndOutsDataSet.Users' table. You can move, or remove it, as needed.
        this.usersTableAdapter.Fill(this.spendingInsAndOutsDataSet.Users);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string userNameText = userName.Text;
        string passwordText = password.Text;

        foreach (DataRow row in spendingInsAndOutsDataSet.Users)
        {
            if (row.ItemArray[4].Equals(userNameText) && row.ItemArray[5].Equals(passwordText))
            {
                MessageBox.Show("Login Successful");

                MainGUI newForm = new MainGUI();
                this.Visible = false;
                newForm.Show();
                break;
            }
            else
            {
                userName.Text = String.Empty;
                password.Text = String.Empty;
                MessageBox.Show("Login Failed");
                break;
            }
        }
    }

当登录成功时,我要做的是将当前 PC 的 MachineName 写入我的 SQL 数据库中 Users 表中的一个字段。这样,当我开始创建记录时,我可以快速找到我的 UsersId(这是我的 Transactions 表中的外键)。

我知道您可以使用 System.Enviroments 路径获取事件机器名称,但我不确定具体如何编写更新。我知道如何使用 SqlCommand 执行此操作,但我想知道是否有更简单的方法来使用我在 ForEach 循环中使用的 DataRows。

提前致谢,如有任何问题,请告诉我。

詹姆斯

最佳答案

假设它是一个 Access 数据库(如果不是,则进行必要的更改):

使用适配器用您的结果填充表格。然后将行列与用户提供的信息进行比较。不要忘记使用参数来避免可能破坏数据库或将用户信息暴露给黑客的注入(inject)。

DataTable dt = new DataTable();
String sql = "SELECT * FROM users WHERE user = @user and password=@password"
OleDbConnection connection = getAccessConnection();
OleDbDataAdapter da = new OleDbDataAdapter(sql, connection);
da.SelectCommand.Parameters.Add("@user", OleDbType.VarChar).Value = userNameText;
da.SelectCommand.Parameters.Add("@password", OleDbType.VarChar).Value = password.Text;
try
{
   connection.Open();
   da.Fill(dt);
   connection.Close();
}
catch(OleDbException ex)
{
   connection.Close();
   MessageBox.Show(ex.ToString());
}

if(dt.Rows.Count == 1)
    return true; //username && password matches
else if(dt.Rows.Count == 0)
    return false; // does not match

您也可以使用 AddWithValue 作为参数。

da.SelectCommand.Parameters.AddWithValue("@user", userNameText);

getAccessConnection() 是一个预定义的 OleDbConnection 函数,它连接到数据库设置并为您创建一个新的连接实例(我为自己创建的)。

public OleDbConnection getAccessConnection()
{
    this.connection = new OleDbConnection();
    this.connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
            + Classified.SOURCE + ";Jet OLEDB:Database Password=" 
            + Classified.PASS + ";";
    return this.connection;
}

最好为可能加入该项目的开发人员创建所有这些功能的类。另请阅读 C# 测试驱动开发。

此外,即使一条记录失败,您的循环看起来也会中断,只允许它转到第一条记录。

创建自己的数据集并用查询表填充它也很有用。这是一个简短的例子:

DataSet ds = new DataSet();
ds.Tables.Add(dt, "userSearchedTable");
ds.Tables["userSearchedTable"].Rows[0][1].ToString();

然后您可以在需要时在集合中声明特定的数据表。

关于C# 登录屏幕 - 在 SQL 表中查找用户并更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258148/

相关文章:

c# - 使用网络连接的线程在某些计算机上速度慢而在其他计算机上速度快

java - 如何在 jdbc/derby 中连接两个 varchars?

sql - 从两个连续行中检索组合的查询

c# - 我可以在 Windows 照片查看器中打开图像而无需图像路径吗

c# - 使用反射唯一标识方法或构造函数

sql - 将 Postgres\i 输入的输出放入文件?

c# - checkListBox selectedindex和sql映射

sql - 将 STRING_AGG 转换为 FOR XML 路径

c# - 在架构定义中找不到类型名称

MySql - 连接 - 连接同一个表两次