我目前正在编写一个小型应用程序来跟踪货币的来龙去脉,这只是为了提高我的一般 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/