无法在VS 2010中对本地数据库执行查询
本文关键字:数据库 执行 查询 VS 2010 | 更新日期: 2023-09-27 18:26:28
我正在使用Access中创建的本地DB,我将其作为DataSource添加到我的C#项目中。
这是这个数据库的一个表,名为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、dataGridView
和button
中使用的房间列表。我想写一个查询,返回给定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();
}
}
}
但当我运行它并点击按钮时,我在adapter.Fill(queryResult);
线上收到了一个错误
System.Data.dll
中发生未处理的System.Data.OleDb.OleDbException
类型异常附加信息:
IErrorInfo.GetDescription
失败,E_FAIL
(0x80004005)
我试图简化查询,删除参数,但结果保持不变。
编辑:
我将查询简化为如下所示:string query = "SELECT * FROM [Session] ";
。这仍然不会产生任何结果,但之前的错误已被15秒的冻结所取代。
尝试在列上加括号:
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() ";
编辑:会话是一个访问保留字,它不会喜欢这样。请参阅此处的保留字列表:访问保留字列表
尝试删除测试运行的[SessionDate]=DATE()子句,因为DATE(和[SessionDate]返回的Dates可能是不同的日期格式。(美国与欧洲)。您可能必须首先格式化[SessionDate]列,以匹配DATE()的形式。或者使用DATEDIFF函数。无论如何,您可以将DATE()添加到select语句中,以便并排查看这两个日期,并在结果中突出显示它们(当您通过将WHERE子句修剪为仅RoomID来获得结果时)。。。。显然,请按照其他评论的建议,在保留字周围加上[]。HTH(我只想发表评论,但声誉太低)