gpt4 book ai didi

C# 无法将数据库值转换为字符串

转载 作者:行者123 更新时间:2023-11-30 13:54:05 25 4
gpt4 key购买 nike

我正在处理一个学校项目,但在将一段数据从 Access 数据库转换为可以传递给 C# 中的第二个表单的字符串时遇到了问题。我知道与数据库的连接正在工作,并且我正在引用其中的正确表来获取信息,所以我不确定我做错了什么。它没有在代码中显示任何错误,但每次我运行该应用程序时,它都会崩溃,因为它无法从数据库中为 string accountnumber = reader["Account_Number"] 处的字符串找到值。 ToString(); 行。我做错了什么吗?

OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = "select * from User_Info where Username='" +txt_Username.Text+ "' and Password='" +txt_Password.Text+ "'";
OleDbDataReader reader = command.ExecuteReader();
int count = 0;
string accountnumber = reader["Account_Number"].ToString();
while (reader.Read())
{
count = count+1;
}
if (count == 1)
{
MessageBox.Show("Login Successful!", "Success!");
connection.Close();
connection.Dispose();
this.Hide();
User_Account_Screen UAS = new User_Account_Screen();
UAS.Number = accountnumber;
UAS.ShowDialog();

最佳答案

  1. 除非万不得已,否则尽量不要重复使用连接。主要原因是您通常希望尽快关闭连接,如果您有多个数据驱动的事件/操作可能同时发生,它将保护您免受以后可能出现的竞争条件。
  2. 尽快关闭你的连接,这样你就没有开放的外部资源。
  3. 为确保 1 和 2 发生,请将您的 IDisposable 类型包装在 using block 中。
  4. 在查询中始终使用参数而不是字符串连接。它可以防止 sql 注入(inject)(不适用于 MS Access)并确保您永远不会遇到包含转义字符的字符串问题。
  5. 关于 MS Access 和参数的说明:占位符通常由 ? 字符指定,并且与位置相关。 这很关键,您不能依赖参数的名称。如果您有一个参数集合,该集合中有 3 个参数,那么这些参数必须以相同的顺序出现在查询中。
  6. 我注意到你可能有明文密码,永远不要以明文形式存储密码!而是存储密码的哈希值。查看密码是否与输入的登录散列中用户提供的密码匹配,然后将该散列与存储的散列进行比较以查看它们是否相同。使用安全的密码哈希算法,如 pbkdf2 , scrypt , 或 bcrypt .
  7. 要查看一行是否存在或只返回一个值,您还可以使用带有空检查的 ExecuteScalar,因为如果没有记录返回,它将返回 null。我更改了代码以使用 ExecuteScalar 返回 accountnumber。我还将列名称括在方括号中,这是在列名称中包含 a-z 和 0-9 范围之外的字符时的好习惯。
  8. 如果您想要返回数据并使用数据读取器读取数据,那么不要使用 * 进行返回。而是指定您的列名。这将保护您的代码免受模式更改的影响,例如添加列或更改列顺序。

这是更新后的代码。

string accountnumber = null;

using(OleDbConnection connection = new OleDbConnection(/*add your connection string here*/))
using(OleDbCommand command = new OleDbCommand("select [Account_Number] from User_Info where Username = ? AND Password = ?", connection))
{
command.Parameters.Add(new OleDbParameter("@username", OleDbType.VarChar)).Value = txt_Username.Text;
command.Parameters.Add(new OleDbParameter("@password", OleDbType.VarChar)).Value = txt_Password.Text;

connection.Open();
accountnumber = command.ExecuteScalar() as string;
}

if (accountnumber != null)
{
MessageBox.Show("Login Successful!", "Success!");
this.Hide();
User_Account_Screen UAS = new User_Account_Screen();
UAS.Number = accountnumber;
UAS.ShowDialog();
}

关于C# 无法将数据库值转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com