Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Качване на файл от Access към SQL Server с DAO код - грешка при изискване на обект

Set ключовата дума се използва за задаване на променлива към препратка към обект. Вашият .Value не е обект, а е Null. Оттук и Задължителен обект грешка.

Кодът, който намерихте, се използва за полета за прикачени файлове на Access. Varbinary(Max) , обаче, не е поле за прикачен файл, а картографира към OLE обект в Access/DAO. Това означава, че трябва да зададете стойността на байтов масив, съдържащ файловите данни, вместо да използвате вложен набор от записи за управление на прикачени файлове.

Има много начини за зареждане на файл в байтов масив. Предпочитам следния код, който използва ADODB.Stream обект.

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

За да го съхраните обратно във файл:

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

Ако наистина не харесвате ADODB и дори мисълта за ADODB.Stream ви отвращава, можете също да използвате самата VBA, за да прочетете файл в байтов масив:

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

Този последен код ще ограничи максималния размер на файла от 2 147 483 647 байта (максималния размер на Long). Това обаче е и максималният размер на база данни на Access, така че вероятно ще имате проблеми преди това. Този код също така не използва разкъсване, така че може да използва повече памет от необходимото.




  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# или SQL?

  2. SQL Fuzzy Matching

  3. Получаване на броя дни от седмицата (неделя, понеделник, вторник) между две дати SQL

  4. Мога ли да накарам SQL Server да извиква съхранена процедура на всеки n секунди?

  5. Как да получите OBJECT_NAME() от различна база данни в SQL Server