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


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
05.06.2006, 14:27
    #33772366
farbox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
У меня не получается никак поботь функцию GetFileSize, и библитеку подцепил.
Выдаёт ошибку "Argument not optional"
...
Рейтинг: 0 / 0
05.06.2006, 15:47
    #33772622
squid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
Функция 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
05.06.2006, 15:57
    #33772673
farbox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
теперь ругается на "MAX_PATH" пишет что "Constant expression required"
...
Рейтинг: 0 / 0
05.06.2006, 16:02
    #33772687
farbox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
и FILETIME не определён как его нужно определить?
...
Рейтинг: 0 / 0
05.06.2006, 16:27
    #33772793
squid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
Извиняюсь.... кусками из кода вырвал, непроверил :((
Исправляюсь, вот модуль к реализцации функции 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
05.06.2006, 16:36
    #33772829
farbox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
ВСё получилось , всё работвает нормально , записывает данные, спасибо большое .
Теперь встаёт другой вопрос : как эти данные от туда извлекать ? как делать обратные преобразования ???
Очень и Очень буду благодарен вам за помощь!
...
Рейтинг: 0 / 0
05.06.2006, 17:03
    #33772925
squid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
Могу подсказать 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
06.06.2006, 09:52
    #33773866
farbox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
Тут ещё одна проблемка вылазиет , у меня почему то rst.EOF = true
и соответственно внутренний цикл не идёт . может чего то не хватает ? почему же не идёт ?
...
Рейтинг: 0 / 0
06.06.2006, 10:26
    #33773957
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись в image SQL Server
Потому что в таблице Files нет записей.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / запись в image SQL Server / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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