我正在开发一个从数据库(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设置为在数据库中具有集合名称(“... WHERE Username ='Mitchell'”;)时,则输入while循环并分配变量。真棒。所以参数发生了一些事情。
此外,我已经确认在调用此方法之前用户数据位于数据库中,因此应该找到它。
答案 0 :(得分:0)
根据我的记忆,访问不支持命名参数,并使用" @ parm"在哪里" parm"与您打算更新的列名称相同,可能会暗示......
set ColumnA = ColumnA
vs您实际提供的参数。 "?"你是否正确充当参数的序数占位符,所以我只想尝试从
改变"@Username" to just "parmUserName"
不要使用" @"登录
答案 1 :(得分:0)
因此,经过几个小时的游戏后我找到了解决方案,但是我并不完全确定它为什么会起作用。我不得不将OleDbConnection的数据源更改为直接文件路径,而不是相对路径。
在此方法之前是另一个将数据插入数据库的方法,并且只有在程序关闭后才能使用此UpdatePage方法访问它。不完全确定原因,但我也必须在其他方法中使用完整地址。