2013-08-05 73 views
1

我正在使用在Access中创建的本地数据库,该数据库作为DataSource添加到我的C#项目中。无法对VS 2010中的本地数据库执行查询

下面是该数据库中的一个表,表名为Session

(PK)sessionID roomID  sessionDate  sessionTimeStart sessionTimeEnd 
1ACMP2343  MB0302  05/08/2013   12:00 AM  14:00 PM 
2ACMP2343  MB2031  05/05/2013   09:00 AM  11:00 PM 
1ACMP3456  TRY223  15/05/2013   12:00 AM  13:00 PM 
2ACMP3456  CMP200  01/05/2013   10:00 AM  13:00 PM 
1ABIO3422  MB2031  05/08/2013   11:00 AM  13:00 PM 
2ABIO3422  CMP200  01/04/2013   14:00 AM  16:00 PM 
1ABIO2217  MB0302  12/05/2013   16:00 AM  18:00 PM 
2ABIO2217  MB2031  03/05/2013   12:00 AM  14:00 PM 

我有一个形式listbox在DB,dataGridViewbutton使用房间列表。我想写一个查询,将返回给定的roomID今天的会议。用户从列表框中选择值,单击按钮,结果将出现在dataGridView

所以,如果我会选择余地MB0302,结果应该是:

1ACMP2343  MB0302  05/08/2013   12:00 AM  14:00 PM 

(还有一个会话与名单上的这个房号,但发生在不同的日期比今天)

我曾尝试:

using System; 
using System.Data; 
using System.Data.OleDb; 
using System.Windows.Forms; 

public partial class RoomSelect : Form 
{ 
    DataTable queryResult = new DataTable(); 
    public string RoomID; 

    public RoomSelect() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     switch (listBox1.SelectedItem.ToString()) 
     { 
      case "MB0302": 
       RoomID = listBox1.SelectedItem.ToString(); 
       roomQuery(); 
       break; 
      case "MC1001": 
       RoomID = listBox1.SelectedItem.ToString(); 
       roomQuery(); 
       break; 
      case "MC3203": 
       RoomID = listBox1.SelectedItem.ToString(); 
       roomQuery(); 
       break; 
      case "MC3204": 
       RoomID = listBox1.SelectedItem.ToString(); 
       roomQuery(); 
       break; 
     } 
    } 

    public void roomQuery() 
    { 
     string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Kacper\\Desktop\\AutoReg\\AutoReg\\AutoReg.accdb;"; 
     OleDbConnection MyConn = new OleDbConnection(ConnStr); 
     MyConn.Open(); 

     //SQL query that todays sessions for the given roomID 
     string query = @"SELECT se.SessionID, se.RoomID, se.SessionDate, se.SessionTimeStart, se.SessionTimeEnd" + 
      " FROM Session se " + 
      " WHERE se.RoomID = @RoomID " + 
      " AND se.SessionDate = Date() "; 
     OleDbCommand command = new OleDbCommand(query, MyConn); 
     command.Parameters.Add("RoomID", OleDbType.Char).Value = RoomID; 

     OleDbDataAdapter adapter = new OleDbDataAdapter(command); 
     adapter.Fill(queryResult); 
     if (queryResult.Rows.Count == 0) 
     { 
      MessageBox.Show("No active sessions today for the given room number"); 
      MyConn.Close(); 
     } 
     else 
     { 
      dataGridView1.DataSource = queryResult; 
      MyConn.Close(); 
     } 
    } 
} 

但是当我运行它,并CLIC K于按钮,我收到上线adapter.Fill(queryResult);

System.Data.OleDb.OleDbException类型的未处理的异常发生在System.Data.dll

附加信息中的错误:IErrorInfo.GetDescription失败,E_FAIL(0X80004005)。

我试图简化查询,删除参数,但结果保持不变。

编辑:

我简化了我的查询看起来像这样:string query = "SELECT * FROM [Session] ";。这仍然不会产生任何结果,但之前的错误已被15秒取代。冻结。

回答

0

尝试把支架上的列:

string query = @"SELECT [se.SessionID], [se.SemesterA], [se.SemesterB], [se.RoomID], [se.SessionDate], [se.SessionTimeStart], [se.SessionTimeEnd]" + 
" FROM Session se " + 
" WHERE [se.RoomID] = @RoomID " + 
" AND [se.SessionDate] = Date() "; 

编辑:Session是访问保留字,也不会喜欢。请参阅此处的保留字列表:Access Reserved Words List

+0

不幸的是,没有工作 – jaspernorth

+0

尝试使用相同的想法(括号)没有Where子句,也许只有一列,或所有使用* –

+0

字符串查询= @“SELECT *”+ “FROM Session”+ “WHERE [se.RoomID] = @RoomID”+ “AND [se.SessionDate] = Date()”; 这也没有奏效...... – jaspernorth

0

尝试从测试运行中删除[SessionDate] = DATE()子句,因为DATE()和[SessionDate]返回的日期可能是不同的日期格式。 (美国与欧洲)。您可能必须先格式化[SessionDate]列,以匹配DATE()的格式。或使用DATEDIFF功能。无论如何,您可以将DATE()添加到您的select语句中,并排查看这两个日期,并将它们放在结果中(当您仅通过修剪WHERE子句给RoomID得到结果)....显然,请按照其他意见建议[ ]围绕保留字。HTH(我只想评论 - 但声誉太低)

+0

如果名称[Session]导致问题,创建一个VIEW /在Access中使用新名称和查询替代... – Grantly