【问题标题】:The provider could not determine the Object value exception with Access database提供程序无法确定 Access 数据库的对象值异常
【发布时间】:2013-09-08 04:45:09
【问题描述】:

我正在尝试将此查询应用于 Access 数据库:

OleDbConnection acessConn = database.con_accessa_m(acessdbs[i]);

string acessquery = "SELECT LTRIM(MID([Owner], 1, INSTR( [Owner],'/')-1)) AS 'lastname',IIf( INSTR( LTRIM(MID([Owner], INSTR( [Owner], '/')+1)), '/')>0,LTRIM(MID(LTRIM(MID([Owner], INSTR( [Owner], '/')+1)),1,INSTR( LTRIM(MID([Owner], INSTR( [Owner], '/')+1)), '/')-1)),LTRIM(MID([Owner], INSTR( [Owner], '/')+1))) AS 'firstname',City FROM Policies";

DataTable Policies = new DataTable();

acessConn.Open();
OleDbCommand myAccessCommand = new OleDbCommand(acessquery, acessConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
myDataAdapter.Fill(Policies);
acessConn.Close();

连接工作正常,但我在myDataAdapter.Fill(Policies); 中遇到异常说:

“提供者无法确定对象值。例如, 行刚刚创建,对象列的默认值不是 可用,而消费者尚未设置新的 Object 值。”

注意:该查询正在 Microsoft 访问中运行。

连接字符串是:

string accconnstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + folderserverpath;` 

其中folderserverpath 是服务器上的数据库路径。

为什么会出现这个错误,解决方法是什么?

【问题讨论】:

  • 我建议尝试简化查询以查看错误在什么时候消失,或者从什么时候开始。像这样的带有所有这些功能的查询对我来说很可怕。我通常在设计期间采取措施避免这样的查询变得必要。我不确定,但您使用的提供程序处理 SQL 的方式可能与在 MS Access 环境中的处理方式不同。
  • 我添加了 'where' 条件并且它起作用了。实际上我试图简化它,但很难简化它:)
  • 所以您添加了一个 WHERE,它排除了某些在您的其他函数中不起作用的数据?换句话说,“坏数据”?
  • @kartal:如果您已经解决了自己的问题,请在此处发布并接受解决方案,以便其他有类似问题的人受益。
  • 我在使用 OLE 对象时遇到了同样的问题,它是图像的列。它曾经工作,但后来这个错误开始出现,我不知道为什么?

标签: c# database ms-access


【解决方案1】:

我在使用 Access 数据库时遇到了同样的问题。 我试图执行以下查询:

SELECT * FROM [Suppliers] WHERE ([CompanyID] = @Pm01)

但我遇到了同样的错误。 我试图通过仅检索某些数据列而不是从数据表中检索所有数据列来找出问题所在。 为此,我没有使用 *,而是使用了特定的数据列名称,例如 [CompanyName]、[CompanyID]。 我将上述查询转换为以下内容:

SELECT [CompanyName], [CompanyID] FROM [Suppliers] WHERE ([CompanyID] = @Pm01)

我没有再看到错误,问题解决了。 Microsoft Access 扩展库或 Access 数据库一定有问题。其中一个数据列中的数据可能与预期不同。 我不知道为什么会出现这样的错误。

【讨论】:

    【解决方案2】:

    我在使用SQL Server Migration Assistant for Access 从 Access 转换到 SQL Server 时遇到了这个问题。为了解决这个问题,我打开了有问题的 Access 数据库。然后我File > "Compact & Repair"。然后我保存并关闭了 Access 数据库。然后我重新导入数据库,它工作正常。

    【讨论】:

    • 对 SQL Server 迁移向导的引用起初似乎有点离题,但这可能为我节省了至少一个小时徒劳的试验和狂欢。
    • 这个答案为我节省了数小时的研究时间。谢谢你,先生。愿你的家装满水果,让你的心充满爱。
    • 同样,谢谢,这节省了我几个小时。非常感谢。
    【解决方案3】:

    在您的查询中,可能有一些“垃圾”或损坏的数据,可能是您的字符集无法证明的字符。我建议尝试在您的数据集中查找任何不良数据,或在此行中使用某种类型的“WHERE”子句:

    string acessquery = "SELECT LTRIM(MID([Owner], 1, INSTR( [Owner],'/')-1)) AS 'lastname',
    IIf( INSTR( LTRIM(MID([Owner], INSTR( [Owner], '/')+1)), '/')>0,
    LTRIM(MID(LTRIM(MID([Owner], INSTR( [Owner], '/')+1)),1,
    INSTR( LTRIM(MID([Owner], INSTR( [Owner], '/')+1)), '/')-1)),
    LTRIM(MID([Owner], INSTR( [Owner], '/')+1))) AS 'firstname', 
    City FROM Policies";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2016-12-23
      • 2018-03-28
      • 1970-01-01
      相关资源
      最近更新 更多