none
C#能否直接读取Access2010附件中的文本文件? RRS feed

  • 问题

  • 在高手的帮助和启发下,我已经实现了在C#里对Access2010数据库附件进行LoadFromFile和SaveToFile二项功能,但我觉得还是很麻烦。不知道是否能实现直接读取附件中的文本文件。请哪位高手予以指点一二为盼。


    guo302
    2011年8月24日 9:50

答案

  • 没有什么不可以的,接我上一篇回复你的代码,rsatts("FileData").Value 里面包含的字节流(byte())便是你想要的东西,将它还原为String就好,不过之前还需要做一点功夫,把字节流的头部信息过滤掉,大概的代码片段如下:

      '过滤掉头部的信息
      Function FilterHead(b As Byte()) As Byte()
        Dim f = b(0)
        Dim r(b.Length - f) As Byte
        Array.Copy(b, f, r, 0, r.Length - 1)
        Return r
      End Function
    
            While Not rsatts.EOF
              TextBox1.Text = Encoding.Default.GetString(FilterHead(rsatts("FileData").Value))
              rsatts.MoveNext()
            End While
    


    当然这只是针对纯文本的的操作,如果附件里面还有其他格式的内容,这些内容的读取都需要自己去实现


    算神的博客
    • 已标记为答案 guo302 2011年8月25日 2:54
    2011年8月25日 2:45
  •   Dim tempHead As Byte()
    
      Sub SaveHead(b As Byte())
        Dim f = b(0)
        Dim r(f) As Byte
        Array.Copy(b, r, f)
        tempHead = r
      End Sub
    
      '过滤掉头部的信息
      Function FilterHead(b As Byte()) As Byte()
        '过滤前先保存头部 备用
        SaveHead(b)
        Dim f = b(0)
        Dim r(b.Length - f) As Byte
        Array.Copy(b, f, r, 0, r.Length - 1)
        Return r
      End Function
    
            While Not rsatts.EOF
    					IF rsatts("FileName").Value = "test.txt" Then
    						'将文件保存出来
    						TextBox1.Text = Encoding.Default.GetString(FilterHead(rsatts("FileData").Value))
    						'象征性的加几个文字
    						Dim editedtxt = TextBox1.Text & "修改"
    						'将内容还原为字节流
    						Dim content = Encoding.Default.GetBytes(editedtxt)
    						'将头部和内容合体
    						Dim tempList = tempHead.ToList
    						tempList.AddRange(content.ToList)
    						'写回原来的字段里面
    						rstable.Edit()
    						rsatts.Edit()
    						rsatts("FileData").Value = tempList.ToArray
    						rsatts.Update()
    						rstable.Update()
    						Exit While
    					Else
    						rsatts.MoveNext()
    					End IF
            End While
    

     


    算神的博客
    • 已标记为答案 guo302 2011年8月26日 3:59
    2011年8月26日 2:27
  • 你好!

    若列数据格式设置为 OLE ,那么就不能直接对数据进行操作。如果你只存文本可以考虑使用"备注"类型的字段


    知识改变命运,奋斗成就人生!
    • 已标记为答案 guo302 2011年8月25日 2:33
    2011年8月25日 2:15
    版主
  • 谢谢算神,真的很感谢众多朋友的帮助。我手中没有Microsoft.Office.Interop.Access.Dao的任何资料,所以学起来比较费劲。能否提供一个中文资料?先谢了。我先把你今天提供的方法在C#里试试。
    guo302

    这方面的资料的确很少,中文的几乎没有,我平时做Office相关开发的时候,都是先在Office里面操作一遍,录制VBA宏,然后在把VBA的代码,复制到.Net里面,加些引用,改几个字就可以了,这也是我的代码片段一直都是用VB的原因,C#做Office相关开发时候的代码很别扭
    算神的博客
    • 已标记为答案 guo302 2011年8月25日 7:13
    2011年8月25日 3:10

全部回复

  • 您好,不知您的麻烦指的是什么,可以考虑将繁琐的步骤封装成一个帮助类。
    2011年8月24日 13:33
    版主
  • 你好,Jiyuan先生。我现在说的麻烦意思是:首先要把Access2010附件中的文件【SaveToFile】到硬盘,C#程序读取该文件记录并处理后把结果写回该文件;然后把该文件再【LoadFromFile】回附件里。我有点异想天开,希望能省略【SaveToFile】和【LoadFromFile】二个过程,程序直接读取附件中文件,处理后再把结果直接写到附件中的文件。就像其他格式一样(如文本、数据),直接读取记录后再写回记录。不知我说了半天,你是否明白我的想法。
    guo302
    • 已标记为答案 guo302 2011年8月25日 2:32
    • 取消答案标记 guo302 2011年8月25日 2:33
    2011年8月25日 1:51
  • 你好!

    若列数据格式设置为 OLE ,那么就不能直接对数据进行操作。如果你只存文本可以考虑使用"备注"类型的字段


    知识改变命运,奋斗成就人生!
    • 已标记为答案 guo302 2011年8月25日 2:33
    2011年8月25日 2:15
    版主
  • 谢谢肖先生。你的建议是个不错的做法。
    guo302
    2011年8月25日 2:32
  • 没有什么不可以的,接我上一篇回复你的代码,rsatts("FileData").Value 里面包含的字节流(byte())便是你想要的东西,将它还原为String就好,不过之前还需要做一点功夫,把字节流的头部信息过滤掉,大概的代码片段如下:

      '过滤掉头部的信息
      Function FilterHead(b As Byte()) As Byte()
        Dim f = b(0)
        Dim r(b.Length - f) As Byte
        Array.Copy(b, f, r, 0, r.Length - 1)
        Return r
      End Function
    
            While Not rsatts.EOF
              TextBox1.Text = Encoding.Default.GetString(FilterHead(rsatts("FileData").Value))
              rsatts.MoveNext()
            End While
    


    当然这只是针对纯文本的的操作,如果附件里面还有其他格式的内容,这些内容的读取都需要自己去实现


    算神的博客
    • 已标记为答案 guo302 2011年8月25日 2:54
    2011年8月25日 2:45
  • 谢谢算神,真的很感谢众多朋友的帮助。我手中没有Microsoft.Office.Interop.Access.Dao的任何资料,所以学起来比较费劲。能否提供一个中文资料?先谢了。我先把你今天提供的方法在C#里试试。
    guo302
    2011年8月25日 2:54
  • 谢谢算神,真的很感谢众多朋友的帮助。我手中没有Microsoft.Office.Interop.Access.Dao的任何资料,所以学起来比较费劲。能否提供一个中文资料?先谢了。我先把你今天提供的方法在C#里试试。
    guo302

    这方面的资料的确很少,中文的几乎没有,我平时做Office相关开发的时候,都是先在Office里面操作一遍,录制VBA宏,然后在把VBA的代码,复制到.Net里面,加些引用,改几个字就可以了,这也是我的代码片段一直都是用VB的原因,C#做Office相关开发时候的代码很别扭
    算神的博客
    • 已标记为答案 guo302 2011年8月25日 7:13
    2011年8月25日 3:10
  • 算神先生,您好!早上按你提供的方法已在C#调试通过,非常感谢您的帮助!现在还有一个难题是如何将读出的附件中的文件经程序处理后再写回附件中的原文件里(即覆盖原文件),仍然不经过硬盘存储(生成文件再通过原来的【LoadFromFile】方法实现。如您能再抽空予以解答,不甚感激!!!

    2011年8月25日 7:12
  •   Dim tempHead As Byte()
    
      Sub SaveHead(b As Byte())
        Dim f = b(0)
        Dim r(f) As Byte
        Array.Copy(b, r, f)
        tempHead = r
      End Sub
    
      '过滤掉头部的信息
      Function FilterHead(b As Byte()) As Byte()
        '过滤前先保存头部 备用
        SaveHead(b)
        Dim f = b(0)
        Dim r(b.Length - f) As Byte
        Array.Copy(b, f, r, 0, r.Length - 1)
        Return r
      End Function
    
            While Not rsatts.EOF
    					IF rsatts("FileName").Value = "test.txt" Then
    						'将文件保存出来
    						TextBox1.Text = Encoding.Default.GetString(FilterHead(rsatts("FileData").Value))
    						'象征性的加几个文字
    						Dim editedtxt = TextBox1.Text & "修改"
    						'将内容还原为字节流
    						Dim content = Encoding.Default.GetBytes(editedtxt)
    						'将头部和内容合体
    						Dim tempList = tempHead.ToList
    						tempList.AddRange(content.ToList)
    						'写回原来的字段里面
    						rstable.Edit()
    						rsatts.Edit()
    						rsatts("FileData").Value = tempList.ToArray
    						rsatts.Update()
    						rstable.Update()
    						Exit While
    					Else
    						rsatts.MoveNext()
    					End IF
            End While
    

     


    算神的博客
    • 已标记为答案 guo302 2011年8月26日 3:59
    2011年8月26日 2:27
  • 感谢微软搭建了这么好的平台,感谢算神毫无保留的把自己的知识奉献给众多的网友和我。非常的感谢!!!!!!!


    guo302
    2011年8月26日 4:01