现有 Access DB 上的 C# 附件字段更新

Posted

技术标签:

【中文标题】现有 Access DB 上的 C# 附件字段更新【英文标题】:C# Attachment field update on existing Access DB 【发布时间】:2012-04-20 19:45:12 【问题描述】:

我有一个最近添加了附件字段的 Access 表。该表是计算机列表和有关每台计算机的信息。它的用户、安装的软件等等。附件字段将包含从每台计算机接收到的简单文本配置文件。

我使用了一些在这里找到的代码:Programmatically managing Microsoft Access Attachment-typed field with .NET

我的问题是我似乎无法更新正确的字段。这意味着计算机名称 Bob 的配置文件被放置在正确的字段中,但如果这有意义,则错误的计算机。下面是一个 SQL 语句示例。

Select * From MyTable WHERE ComputerName Like 'Bob'

下面的整个代码段按要求。

public void InsertFile(String Path, String CmpName)
   
    DBEngine dbe = new DBEngine();
    Database db = dbe.OpenDatabase("MyAccessDB.accdb", false, false, "");
    Recordset rs = db.OpenRecordset(
        "SELECT * FROM MyTable WHERE ComputerName LIKE '" + CmpName + "\'",
        RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic);
    rs.MoveFirst();
    rs.Edit();
    Recordset2 rs2 = (Recordset2)rs.Fields["My_File"].Value;
    rs2.AddNew();
    Field2 f2 = (Field2)rs2.Fields["FileData"];
    f2.LoadFromFile(Path);

    rs2._30_Update();
    rs2.Close();
    rs._30_Update();
    rs.Close();          

我希望当使用OpenRecodeset() 时,上面的语句会给我那一行,然后是那一行的唯一附件字段。然而,这种情况并非如此。我已经搜索找到如何迭代记录集以找到正确的行但没有运气。我是新来的,所以我希望我涵盖了我需要的所有内容。

【问题讨论】:

你能展示一下该语句的代码吗? 【参考方案1】:

我不确定我是否理解您的问题,但如果您想要的只是附件字段,您的 SQL 查询应该是:

"SELECT attachment FROM MyTable WHERE UCASE(ComputerName) = 'BOB'"

【讨论】:

不客气。我通常远离 SQL 中的 LIKE,因为它的行为在数据库引擎中是不同的。最简单的方法是将两个字符串都转换为大写,然后运行比较。【参考方案2】:

请注意,只有当字段 ComputerName 是主键字段或者您在其上定义了唯一索引时,where 子句 WHERE ComputerName Like 'Bob' 才能可靠地工作。

在任何情况下,您都应该定义一个主键,这样可以确保可以以可靠的方式识别要更新的表记录。


更新

如果ComputerName 是主键,则不要使用LIKE 比较,而是使用=

SELECT attachment FROM MyTable WHERE ComputerName = 'Bob'

【讨论】:

以上是关于现有 Access DB 上的 C# 附件字段更新的主要内容,如果未能解决你的问题,请参考以下文章

使用Excel VBA向Access DB添加附件

更新 Access db 中表的 SINGLE 字段

JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较

NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段

在 C# 中使用 MS Access 查找字段

定义的字段太多 Access DB Oledb