【问题标题】:IErrorInfo.GetDescription failed with E_FAIL(0x80004005) C#IErrorInfo.GetDescription 失败,出现 E_FAIL(0x80004005) C#
【发布时间】:2017-11-15 08:52:10
【问题描述】:

我收到了

IErrorInfo.GetDescription 失败,出现 E_FAIL(0x80004005)

我不知道这意味着什么,也不知道如何解决。当我将 accact 查询复制并粘贴到我的 Acces-db 中并运行它时,它就像一个魅力,但是当我尝试在 c# 中运行它时,我得到了这个错误。

所有参数都填充了正确的值。

@aankomst = 15-11-2017, @vertrek = 20-11-2017, @grootte = "large"

    try
    {
        standplaatslijst.Clear();
        verbinding = new OleDbConnection(
        @"Provider=Microsoft.ACE.OLEDB.12.0;
        Data Source=..\..\..\La_Rustique.accdb;
        Persist Security Info=False;");
        verbinding.Open();

        OleDbCommand query = new OleDbCommand();
        OleDbDataReader lezer = null;
        query.CommandText = @"SELECT *
                              FROM standplaats
                              WHERE id not in (SELECT standplaats_id
                              FROM reservering
                               WHERE @aankomst BETWEEN aankomst AND vertrek
                               AND @vertrek BETWEEN aankomst AND vertrek)
                               AND size = @grootte";

        query.Connection = verbinding;

        query.Parameters.Add(new OleDbParameter("@aankomst", OleDbType.DBDate));
        query.Parameters["@aankomst"].Value = aankomst;
        query.Parameters.Add(new OleDbParameter("@vertrek", OleDbType.DBDate));
        query.Parameters["@vertrek"].Value = vertrek;
        query.Parameters.Add(new OleDbParameter("@grootte", OleDbType.VarChar));
        query.Parameters["@grootte"].Value = grootte;

        lezer = query.ExecuteReader();

        while (lezer.Read())
        {
            standplaatslijst.Add(new standplaats(lezer));
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        verbinding.Close();
    }

我正在将阅读器添加到一个名为 standplaats 的新类中,如下所示:

public standplaats(OleDbDataReader lezer)
    {
        _id = lezer.GetInt32(0);
        Grootte = lezer.GetString(1);
        Name = lezer.GetString(2);
    }

【问题讨论】:

  • 开头是SQL.standplaatslijst.Clear();。后来是standplaatslijst.Add(new standplaats(lezer));。第一个以SQL开头;第二个没有。这看起来很奇怪。不确定那是什么意思;你可以翻译吗?我得到“排名列表”,但也许有更好的词。
  • @wazz standplaatsenlijst 是 sql 类中的一个列表,而 sql 是我目前正在使用的类。生病删除SQL。部分使其更清晰。感谢您的反馈
  • 我认为问题出在standplaatslijst.Add(new standplaats(lezer));。您想要一个新的列表项,但您提供的是整个 Reader,而不是来自 Reader 的数据。
  • 只是一个想法。注意保留字。也许尝试在 [] 中包装来字段。例如:`WHERE [id] not in... 可能不是问题...
  • 我已经看过几次这个修复了:stackoverflow.com/questions/15534284/…

标签: c# ms-access oledbexception


【解决方案1】:

SIZE 是 MS Access 中的保留字。

将查询更改为:

query.CommandText = @"SELECT *
                      FROM standplaats
                      WHERE id not in (SELECT standplaats_id
                      FROM reservering
                       WHERE @aankomst BETWEEN aankomst AND vertrek
                       AND @vertrek BETWEEN aankomst AND vertrek)
                       AND [size] = @grootte";

Here你找到保留字列表。

【讨论】:

  • 感谢您的帮助,但这不起作用。我将查询更改为您的查询,但它不起作用,当我将其粘贴到访问数据库时它确实起作用,但在 c# 代码中没有,我仍然收到错误
  • 对不起,我的错。编辑了答案。现在应该是正确的。
  • 只是一个问题,为什么 size 是保留字而 aankomst 不是?
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 2023-03-04
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多