【问题标题】:Can I programmatically determine (OLEDB) which column length is being exceeded?我可以以编程方式确定 (OLEDB) 超出了哪个列长度吗?
【发布时间】:2014-03-18 17:58:09
【问题描述】:

由于某种原因,我无法打开相关 MS Access 表的设计视图;我可以查看数据,但不能查看设计,特别是列的长度。

当我尝试使用此代码将记录插入到所述表中时:

using (var conn = new OleDbConnection(connStr))
{
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = 
            @"INSERT INTO tx_header (tx, site_no, xmlfile, collect_dttm, ccr_user, tx_memo, file_beg, file_end) 
              VALUES(@txval, @siteNum, @xmlfileName, Now(), @ccrUser, @TXMemo, @strfile_beg, @strfile_end)";
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@txval", tx);
        cmd.Parameters.AddWithValue("@siteNum", site_no);
        cmd.Parameters.AddWithValue("@xmlfileName", xmlfile);
        cmd.Parameters.AddWithValue("@ccrUser", ccr_user);
        cmd.Parameters.AddWithValue("@TXMemo", tx_memo);
        cmd.Parameters.AddWithValue("@strfile_beg", file_beg);
        cmd.Parameters.AddWithValue("@strfile_end", file_end);
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}

...我明白了,“System.Data.OleDb.OleDbException 未被用户代码处理 H结果=-2147217833 Message=该字段太小,无法接受您尝试添加的数据量。尝试插入或粘贴更少的数据。 Source=Microsoft Office Access 数据库引擎"

不必猜测哪一列有太多数据,如果我能以编程方式确定哪一列是有问题的那会很好。我可以吗?怎么样?

【问题讨论】:

  • 您是否考虑过通过标准 ADO.NET 路径获取架构信息?喜欢 IDataReader.GetSchemaTable 方法吗?
  • 我还必须问:为什么您必须动态获取数据库规范?如果从一开始就知道数据库字段类型、长度和约束,您的代码会更加健壮! :p
  • @Crono:你是对的,但是,如前所述,当我使用 Access 打开 MDB 文件时,它不允许我看到设计视图;我不知道为什么。
  • 它可能刚刚被锁定。您是否尝试过按住 Shift 键打开 Access 文件?

标签: c# ms-access oledb oledbexception designview


【解决方案1】:

在 MSDN 中有关于如何查询底层架构信息的非常详细的说明,从 Retrieving Database Schema Information 开始。

免责声明:我从未尝试将它用于 Access 数据库。

【讨论】:

  • 谢谢;我会在尝试的时候喝一些汤力水。
【解决方案2】:

在阅读了您上面的 cmets 之后,我很清楚您的 Access 文件只是将其设计器视图锁定了。通常,您只需按住 Shift 键,双击文件并按住 Shift 键直到 Access 启动并运行,即可解锁它们。

从那时起,您将可以完全访问表、查询等,以及您的数据库规范。这比尝试动态访问要好得多。

【讨论】:

  • 谢谢;有效(尽管出于某种原因,我也必须右键单击文件名并选择访问,而不是通过 XP 模式访问)。这样就解决了我的问题,但是,Tonic Water 先生回答了实际问题......
  • Edmund 确实回答了实际问题,因此值得加分。尽管如此,这里对您的正确调用应该不动态获取数据库详细信息,而是根据众所周知的规范在您的代码中强制执行验证规则。 ;)
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多