我有包含帐户信息的SQL Server Compact 3.5数据库。但每次我调用ExecuteReader函数时,我都会遇到以下异常:
列名无效。 [节点 name(如果有)=,列名= ID]
但这是正确的列名。列名如下:用户名,密码,创建日期等。
以下是代码:
SqlCeConnection connection = new SqlCeConnection(@"Data Source=C:\Users\Danny\Documents\Visual Studio 2010\Projects\Databinding Login Form\Databinding Login Form\MyDatabase#1.sdf; Password=*********");
connection.Open();
SqlCeCommand com = new SqlCeCommand("SELECT * FROM Accounts WHERE ID=Username", connection);
SqlCeDataReader reader = com.ExecuteReader();
if (username.Text == reader["Username"] as string && password.Text == reader["Password"] as string)
{
MessageBox.Show("Login Successfull!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Access Denied 5", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
答案 0 :(得分:2)
你有一个名为“ID”的专栏吗?
看起来您要求所有在“用户名”和“ID”列中具有相同值的帐户?你是不是想用“ID”代替什么?
实施例
Where Username = 'EnteredUsername'
答案 1 :(得分:0)
看起来您的查询“SELECT * FROM Accounts WHERE ID = Username”可能是问题所在。正如您所提到的,Username是一个列名;看起来你应该在查询中输入用户ID,例如“dlopez”:“SELECT * FROM Accounts WHERE ID ='dlopez'”
答案 2 :(得分:0)
where
子句导致错误。我假设您只想选择一个ID等于本地变量调用者username
的帐户。一个解决方案是:
SqlCeCommand com = new SqlCeCommand("SELECT * FROM Accounts WHERE ID='"
+ username + "'", connection);
更正确的解决方案是使用SqlCeParameter:
SqlCeCommand com = new SqlCeCommand("SELECT * FROM Accounts WHERE ID=@UserName", connection);
SqlCeParameter param = new SqlCeParameter("@UserName", SqlDbType.NVarChar);
param.Value = username;
com.Parameters.Add(param);