【问题标题】:unable to execute a query on a local DB in VS 2010无法在 VS 2010 中对本地数据库执行查询
【发布时间】:2013-08-05 20:39:46
【问题描述】:

我正在使用在 Access 中创建的本地数据库,我将其作为数据源添加到我的 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 中使用的房间列表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();
        }
    }
}

但是当我运行它并点击按钮时,我在adapter.Fill(queryResult);这一行收到一个错误

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

附加信息:IErrorInfo.GetDescription 失败,E_FAIL(0x80004005)。

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

编辑:

我已将查询简化为如下所示:string query = "SELECT * FROM [Session] ";。这仍然不会产生任何结果,但之前的错误已被 15 秒所取代。冻结。

【问题讨论】:

    标签: c# ms-access ado.net oledb oledbdataadapter


    【解决方案1】:

    尝试将括号放在列上:

    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() ";
    

    编辑:会话是访问保留字,它不会喜欢这样。在此处查看保留字列表:Access Reserved Words List

    【讨论】:

    • 尝试使用相同的想法(括号),不使用 Where 子句,可能只使用一列,或者使用 *
    • 字符串查询 = @"SELECT *" + " FROM Session " + " WHERE [se.RoomID] = @RoomID " + " AND [se.SessionDate] = Date() ";这也不起作用......
    • 嗯,我认为Session是Access的保留字。 office.microsoft.com/en-us/access-help/… 尝试将这个词 (Session) 括在括号中或这个看起来很有趣的引号中,然后再试一次...
    • 我已将查询更新为:tring query = @"SELECT *" + " FROM [Session] " + " WHERE RoomID = @RoomID " + " AND SessionDate = Date() ";现在没有错误,但仍然没有结果...
    【解决方案2】:

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

    【讨论】:

    • 如果名称 [Session] 导致问题,请在 Access 中创建一个具有新名称的 VIEW / QUERY 并查询...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多