2012-06-02 43 views
0

我正在使用Visual Studio 2010在C#中編寫程序,並在從.sdf文件中檢索數據時出錯。分析查詢時出錯

private void BasicSearch_button_Click(object sender, EventArgs e) 
{ 
    SqlCeConnection cn = new SqlCeConnection(@"Data Source=" + Path.Combine(Application.StartupPath, "FRAT_DB.sdf") + ";[email protected];Persist Security Info=False;Max Database Size=256"); 

    string query = @"SELECT Person.PersonID, Person.Name, PhotoTags.PhotoID, Photo.Path, Photo.Location, Person.Age, Person.P_Group, Person.Email, Photo.Date "+ 
        "FROM Person INNER JOIN PhotoTags ON Person.PersonID = PhotoTags.PersonID INNER JOIN "+ 
        "PhotoON PhotoTags.PhotoID = Photo.PhotoID "+"WHERE (Person.Name LIKE '%%')"; 

    if (txtName1.Text.Trim().ToString() == "" || txtName2.Text.Trim().ToString() == "") 
    { MessageBox.Show("Enter Both, Name1 and Name2"); return; } 
    else if (radioButtonAND.Checked) 
    { 
     query = @"select pt.PhotoID,Photo.Path,photo.Location, Photo.Date from Person p inner join PhotoTags pt on p.PersonID=pt.PersonID inner join Photo on pt.photoID=photo.photoID where Name like '%" + txtName1.Text + "%' and pt.Photoid in (select pt.PhotoID from Person p inner join PhotoTags pt on p.PersonID=pt.PersonID where Name like '%" + txtName2.Text + "%')"; 
    } 
    else 
    { 
     query = @"SELECT DISTINCT Person.PersonID, Person.Name, PhotoTags.PhotoID, Photo.Path, Photo.Location, Person.Age, Photo.Date 
FROM Person INNER JOIN PhotoTags ON Person.PersonID = PhotoTags.PersonID INNER JOIN 
PhotoON PhotoTags.PhotoID = Photo.PhotoID 
WHERE (Person.Name LIKE '%%')"; 
     query += " AND (Person.Name like '%" + txtName1.Text + "%' OR Person.Name like '%" + txtName2.Text + "%')"; 
    } 

    if (cn.State == ConnectionState.Closed) cn.Open(); 

    SqlCeCommand cm_Search = new SqlCeCommand(query, cn); 

    try 
    { 
     SqlCeDataReader rdr = cm_Search.ExecuteReader(); 

     List<PersonPhoto> personPhoto = new List<PersonPhoto>(); 
     List<PersonPhotoWithoutName> personPhotoWithoutName = new List<PersonPhotoWithoutName>(); 

     bool HasRows = rdr.Read(); 

     if (HasRows) 
     { 
      while (rdr.Read()) 
      { 
       if (radioButtonAND.Checked) 
       { 
        personPhotoWithoutName.Add(new PersonPhotoWithoutName 
          { 
           PhotoID = Convert.ToInt32(rdr["PhotoID"].ToString()), 
           Location = rdr["location"].ToString(), 
           Date = rdr["Date"] != null ? Convert.ToDateTime(rdr["Date"]) : DateTime.Now, 
           path = rdr["path"].ToString(), 
          }); 
       } 
       else 
       { 
        personPhoto.Add(new PersonPhoto 
          { 
           Name = rdr["Name"].ToString(), 
           Location = rdr["location"].ToString(), 
           Date = rdr["Date"] != null ? Convert.ToDateTime(rdr["Date"]) : DateTime.Now, 
           path = rdr["path"].ToString() 

          }); 
       } 
      } 
      rdr.Close(); 
      } 
      else 
      { MessageBox.Show("No Records Found"); selectedPictureBox.Image = null; rdr.Close(); } 

      if (personPhoto.Count > personPhotoWithoutName.Count) 
      { 
       DataGridPersons.DataSource = personPhoto; 
       DataGridPersons.Refresh(); 
      } 
      else 
      { 
       DataGridPersons.DataSource = personPhotoWithoutName; 
       DataGridPersons.Refresh(); 
      } 
     } 
     catch (Exception exp) 
     { 
       throw exp; 
     } 

     if (cn.State != ConnectionState.Closed) cn.Close(); 
} 

每當我試着找一個這樣的異常錯誤出現:

有解析查詢時出現錯誤。 [令牌行號= 3,令牌 行偏移= 18,令牌出錯=。 ]

任何幫助?

在此先感謝!

+1

你爲什麼要麻煩爲'query'賦值然後忽略它(通過重新賦值不同的值)?查詢失敗時的值是多少? –

回答

4

我懷疑這就是問題所在:

... INNER JOIN 
PhotoON PhotoTags.PhotoID = Photo.PhotoID ... 

我懷疑你的意思是:

... INNER JOIN 
Photo ON PhotoTags.PhotoID = Photo.PhotoID ... 

PhotoON之間的空間。我懷疑你可以重新格式化你的查詢,所以這會更清楚,說實話...