2011-06-21 24 views
0

アカウント情報を含むSQL Server Compact 3.5データベースがあります。しかし、関数Exec​​uteReaderを呼び出すたびに、次の例外が発生します。サブルーチンを呼び出すときに例外が発生するExecuteReader

この列名は無効です。 [ノード 名前(存在する場合)=、列名= 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); 
      } 

答えて

2

「ID」という列はありますか?

「ユーザー名」列と「ID」列で同じ値を持つすべてのアカウントを要求しているようですか?あなたは何かのために "ID"を代用するつもりでしたか?

Where Username = 'EnteredUsername' 
0

とすることができる「ID =ユーザー名はアカウントからのSELECT *」クエリのように見えます問題。あなたが言ったように、Usernameは列名です。たとえば、「dlopez」のように「dlopez」というユーザーIDを入力する必要があります。「SELECT * FROMアカウントWHERE ID = 'dlopez'」

0

where句がエラーを起こしています。 IDがローカル変数の呼び出し元usernameと等しい1つのアカウントのみを選択するとします。一つの解決策は次のとおりです。

SqlCeCommand com = new SqlCeCommand("SELECT * FROM Accounts WHERE ID='" 
    + username + "'", connection); 

以上正解はSqlCeParameterを使用することです:

SqlCeCommand com = new SqlCeCommand("SELECT * FROM Accounts WHERE [email protected]", connection); 
SqlCeParameter param = new SqlCeParameter("@UserName", SqlDbType.NVarChar); 
param.Value = username; 
com.Parameters.Add(param);