powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / запись в image SQL Server
11 сообщений из 11, страница 1 из 1
запись в image SQL Server
    #33766714
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите, пожалуйста кто-нить !
я в программе использую DataEnvironment . как мне записать из приложения в таблицу на SQL сервере с форматом поля image файл Exel ?
Если есть возможность , помогите с написанием кода, я в этом мало разбираюсь.
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33769403
squid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выдер у себя, корректировал по ходу ;) но впринципе делается это так:


1.Процедура вызова ХП на сервере, передача ей бинарного содержимого файла

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Sub ExecuteFile(file As String)
 Dim rst As New ADODB.Recordset
 Dim Mstream As New ADODB.stream
 Dim ret As Long
 'Dim cn As New ADODB.Connection
 Dim cmd As New ADODB.Command
 Dim param As New ADODB.Parameter
 
 
On Error GoTo readFileErr 

 
 cmd.CommandType = adCmdStoredProc
 cmd.CommandText = "Files_EventOpenFile" 'процедура кот все сделает ;)))
 Set cmd.ActiveConnection = CurrentProject.Connection 'or other active conn
 
 Mstream.Mode = adModeUnknown
 Mstream.Type = adTypeBinary
 Mstream.Open
 Mstream.LoadFromFile file
 

 Set param = cmd.CreateParameter("Data", adBinary, adParamInput, GetFileSize(file) +  1 , Mstream.Read)
 cmd.Parameters.Append param
 
 cmd.Execute ' , , adExecuteStream
 Mstream.Close
 Set Mstream = Nothing
           
is_dir:
readFileErr:
  MsgBox err.Description, vbCritical, "OpenFile"
  
 
End If
 
End Sub



2. А вот и сама ХП записи файла в таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ALTER     Procedure Files_EventOpenFile (@Data image) 
 AS
Begin
   INSERT INTO dbo.FilesVLogOpen (OldData) VALUES     (@Data)

End

...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772366
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не получается никак поботь функцию GetFileSize, и библитеку подцепил.
Выдаёт ошибку "Argument not optional"
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772622
squid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция GetFileSize через АПИ


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Public Declare Function APIFindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long

Public Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String *  14 
End Type


Public Function GetFileSize(FPath As String) As Long
  Dim hFile As Long
  Dim FindData As WIN32_FIND_DATA
  GetFileSize = - 1 
  hFile = APIFindFirstFile(FPath, FindData)
   If hFile <> - 1  Then GetFileSize = FindData.nFileSizeLow
  APIFindClose hFile
  
End Function

...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772673
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь ругается на "MAX_PATH" пишет что "Constant expression required"
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772687
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и FILETIME не определён как его нужно определить?
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772793
squid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь.... кусками из кода вырвал, непроверил :((
Исправляюсь, вот модуль к реализцации функции GetFileSize

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Public Declare Function APIFindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal 
lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long

Public Type FILETIME
 dwLowDateTime As Long
 dhHighDateTime As Long
End Type

Public Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String *  14 
End Type

Private Const MAX_PATH =  260 

Public Function GetFileSize(FPath As String) As Long
  Dim hFile As Long
  Dim FindData As WIN32_FIND_DATA
  GetFileSize = - 1 
  hFile = APIFindFirstFile(FPath, FindData)
   If hFile <> - 1  Then GetFileSize = FindData.nFileSizeLow
  APIFindClose hFile
 
End Function

Функцию ExecuteFile Вы уже проверили ?
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772829
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСё получилось , всё работвает нормально , записывает данные, спасибо большое .
Теперь встаёт другой вопрос : как эти данные от туда извлекать ? как делать обратные преобразования ???
Очень и Очень буду благодарен вам за помощь!
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33772925
squid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу подсказать 2 варианта, проверенных мною
1. Использовать bcp.exe (синтаксис несложен)
2. ADODB.Stream
что типа этого примера, в котором выгружаются на диск D все бинарное содержимое Таблицы Files поля Data, имя файла будет равно Id-у записи в таблице

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim mstream As New ADODB.Stream
Dim rst As New ADODB.Recordset

  mstream.Type = adTypeBinary
 rst.Open "SELECT id, Data FROM Files ORDER BY id", cn
 
While Not rst.EOF
  mstream.Open 'rst.Fields(0), adModeReadWrite, adOpenStreamFromRecord
  mstream.Write rst.Fields("Data")
  mstream.SaveToFile ("D:\" & rst.Fields("id") )
  mstream.Close
 rst.MoveNext
Wend
  rst.close
  MsgBox "ok"

...
Рейтинг: 0 / 0
запись в image SQL Server
    #33773866
farbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут ещё одна проблемка вылазиет , у меня почему то rst.EOF = true
и соответственно внутренний цикл не идёт . может чего то не хватает ? почему же не идёт ?
...
Рейтинг: 0 / 0
запись в image SQL Server
    #33773957
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что в таблице Files нет записей.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / запись в image SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]