调用子例程ExecuteReader时出现异常

时间:2011-06-21 21:02:07

标签: c# sql-server c#-4.0 .net-4.0 sql-server-ce

我有包含帐户信息的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);
            }

3 个答案:

答案 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);