Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tải lên tệp từ Access tới SQL Server với mã DAO - Lỗi bắt buộc đối tượng

Set từ khóa được sử dụng để thiết lập một biến thành một tham chiếu đối tượng. .Value của bạn không phải là một đối tượng, nó là Null. Do đó, Đối tượng bắt buộc lỗi.

Mã bạn tìm thấy được sử dụng cho các trường tệp đính kèm Access. Varbinary(Max) , tuy nhiên, không phải là trường phần đính kèm, nhưng ánh xạ tới một đối tượng OLE trong Access / DAO. Điều đó có nghĩa là bạn cần đặt giá trị thành một dải byte chứa dữ liệu tệp, thay vì sử dụng một tập bản ghi lồng nhau để quản lý tệp đính kèm.

Có nhiều cách để tải một tệp vào một bytearray. Tôi thích mã sau, sử dụng ADODB.Stream đối tượng.

Dim dbsGMEC As DAO.Database
Dim rstWater_Files As DAO.Recordset

Set dbsGMEC = CurrentDb
Set rstWater_Files = dbsGMEC.OpenRecordset("dbo_WATER_FILES", dbOpenDynaset, dbSeeChanges)
rstWater_Files.Edit
Dim strm As Object
Set strm = CreateObject("ADODB.Stream")
strm.Type = 1 'adTypeBinary
strm.Open
strm.LoadFromFile "C:\test.jpg"
rstWater_Files.Fields("Binary_File").Value = strm.Read
strm.Close
rstWater_Files.Update

Để lưu trữ nó trở lại một tệp:

With CreateObject("ADODB.Stream")
    .Type = 1 'adTypeBinary
    .Open
    .Write rstWater_Files.Fields("Binary_File").Value
    .SaveToFile "C:\testcopy.jpg", 2 'adSaveCreateOverWrite
    .Close
End With

Nếu bạn thực sự không thích ADODB và thậm chí là ý nghĩ về ADODB.Stream làm bạn khó chịu, bạn cũng có thể sử dụng chính VBA để đọc tệp thành bytearray:

Dim dbsGMEC As DAO.Database
Dim rstWater_Files As DAO.Recordset

Set dbsGMEC = CurrentDb
Set rstWater_Files = dbsGMEC.OpenRecordset("dbo_WATER_FILES", dbOpenDynaset, dbSeeChanges)
rstWater_Files.Edit
Dim byteArr() As Byte
Dim fileInt As Integer: fileInt = FreeFile
Open "C:\test.jpg" For Binary Access Read As #fileInt
ReDim arr(0 To LOF(fileInt) - 1)
Get #fileInt, , byteArr
Close #fileInt
rstWater_Files.Fields("Binary_File").Value = byteArr
rstWater_Files.Update

Đoạn mã cuối cùng này sẽ giới hạn kích thước tệp tối đa là 2,147,483,647 byte (kích thước tối đa của một Long). Tuy nhiên, đây cũng là kích thước tối đa của cơ sở dữ liệu Access, vì vậy bạn có thể sẽ gặp rắc rối trước đó. Mã này cũng không sử dụng phân đoạn, vì vậy nó có thể sử dụng nhiều bộ nhớ hơn yêu cầu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo mối quan hệ giữa bảng và chế độ xem trong Khung thực thể

  2. Cách truy vấn cột xml trong tsql

  3. Danh sách các định dạng ngày có sẵn với CONVERT () trong SQL Server

  4. Chỉ cập nhật phần Ngày của DateTime

  5. SQL Server 2008 tách, sắp xếp và hợp nhất giá trị