我正在开发一个应用程序,该应用程序从数据库(MS Access)读取用户数据并将信息设置为变量。sql 命令采用一个参数来检查数据库的用户名,但是 OleDbDataReader 显示为空 (userData.HasRows)。
public void UpdatePage(string Username)
{
OleDbDataReader userData;
string sqlCmd = "SELECT * FROM [Profile Data] WHERE Username = ?";
TabPage profile = new TabPage();
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = LogIn Profiles.accdb;"))
{
OleDbCommand cmd = new OleDbCommand(sqlCmd, conn);
cmd.Parameters.AddWithValue("@Username", Username);
try
{
conn.Open();
userData = cmd.ExecuteReader();
if(userData.HasRows)
{
//Used for debugging
}
while (userData.Read()) //is not entering into the loop
{
userID = userData[0].ToString();
username = userData[1].ToString();
password = userData[2].ToString();
country = userData[3].ToString();
occupation = userData[4].ToString();
gender = userData[5].ToString();
}
userData.Close();
}
catch
{
MessageBox.Show("Error 3: Error to connect to database", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
当我删除参数并将 sqlCmd 设置为具有设置名称时("...其中用户名 = '米切尔'";)在数据库中,然后输入 while 循环并分配变量。棒。所以参数发生了一些事情。
此外,我已经确认在调用此方法之前用户数据在数据库中,因此应该找到它。
我所知,访问不支持命名参数,并且在"parm"与您打算更新的列同名的情况下使用"@parm"可能会通过暗示来混淆它......
set ColumnA = ColumnA
与您实际提供的参数相比。 您拥有的"?"作为参数的序号占位符是正确的,所以我会尝试从
"@Username" to just "parmUserName"
不要使用"@"符号
因此,经过数小时的尝试,我找到了解决方案,但是我不完全确定为什么它会起作用。我必须将 OleDbConnection 的数据源更改为直接文件路径,而不是相对路径。
在此方法之前是另一个将数据插入数据库的方法,并且只有在程序关闭后,才能使用此UpdatePage方法访问它。不完全确定为什么,但是我也必须在另一种方法中使用完整地址。