Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO Stream / 15 сообщений из 15, страница 1 из 1
06.12.2006, 18:34
    #34181426
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
Здравствуйте!

Я использую ADO 2.8 (обычный, не .NET) на VBS (WSH v5.6)
Подскажите пожалуйста, как открыть поток ADODB.Stream, связанный с файлом, чтобы прочитать большой файл по частям.

Так работает, но при этом файл загружается целиком в память:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim ADO_Stream

Set ADO_Stream = CreateObject("ADODB.Stream")
ADO_Stream.Type =  1  ' adTypeBinary

ADO_Stream.Open
ADO_Stream.LoadFromFile "D:\BigFile.dat"

ADO_Stream.Close

Хочется, чтобы работало при замене строк с Open и LoadFromFile на одну строку с Open:
Код: plaintext
1.
ADO_Stream.Open "URL=file://D/BigFile.dat"

Но тогда появляется сообщение об ошибке:
"Не удается найти объект или данные, соответствующие имени, области или условиям отбора в области действия операции."
Код 80040E19
Источник: Microsoft OLE DB Service Components

Также пробовал в 1-м параметре Open указать следующие строки:
"D:\BigFile.dat"
"URL=D:\BigFile.dat"
"URL=file://localhost/D:/BigFile.dat"
"URL=file:///D:/BigFile.dat"

Подскажите пожалуйста, можно открыть локальный файл методом Open ?
...
Рейтинг: 0 / 0
08.12.2006, 13:59
    #34186246
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
Никто не сталкивался с такой задачей?

Я на всякий случай сформулирую более общую задачу, подзадачей которой является эта.
Нужно из скрипта загрузить БОЛЬШОЙ (100 Mb и больше) файл в базу данных (MS SQL Server 2000), это все у меня работает, но только файл сначала грузится полностью в память, а потом записывается в базу. Вот и вопрос, как прочитать файл по частям, может для этого какие еще COM-объекты есть, кроме ADO Stream. Поскольку это скрипт, я не могу воспользоваться Windows API и мне нужен COM-объект...
...
Рейтинг: 0 / 0
08.12.2006, 14:38
    #34186413
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
...
Рейтинг: 0 / 0
12.12.2006, 16:54
    #34194081
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To buser
Это хороший ответ, только я работаю на Visual Basic Script и у меня нет объектов FileStream и BinaryReader
...
Рейтинг: 0 / 0
12.12.2006, 17:19
    #34194196
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
Может AppendChunk and GetChunk Methods вам поможет


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
12.12.2006, 17:22
    #34194209
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
А нет способа из vbs читать файл кусками? Да и форумом Вы промахнулись :)
...
Рейтинг: 0 / 0
13.12.2006, 14:08
    #34196585
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To HandKot
Я уже использую AppendChunk, проблема не в работе с базой данных, а в чтении файла с диска в оперативную память

привожу полный текст скрипта
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
Option Explicit

Const Server = "IT17B"
Const Database = "TestBLOB"
Const FullFileName = "D:\BigFile.dat"

Dim ADO_Connection, ADO_Command, ADO_Recordset, ADO_Stream, Field
Dim SQL_Query, CurrentChunk

Sub InitADO()
	Set ADO_Connection = CreateObject("ADODB.Connection")
	ADO_Connection.Provider = "SQLOLEDB"
	ADO_Connection.Properties("Data source").Value = Server
	ADO_Connection.Properties("Initial catalog").Value = DataBase
	ADO_Connection.Properties("Integrated Security").Value = "SSPI"
	ADO_Connection.Open
	
	Set ADO_Command = CreateObject("ADODB.Command")
	Set ADO_Command.ActiveConnection = ADO_Connection
	ADO_Command.CommandType =  1  ' Options = 1 = adCmdText - SQL Text command (query)
	
	Set ADO_Recordset = CreateObject("ADODB.Recordset")
	Set ADO_Recordset.ActiveConnection = ADO_Connection
	ADO_RecordSet.CursorLocation = 2 ' adUseServer
	ADO_RecordSet.CursorType =  2  ' adOpenDynamic
	ADO_RecordSet.LockType = 3 ' adLockOptimistic

	Set ADO_Stream = CreateObject("ADODB.Stream")
	ADO_Stream.Type =  1  ' adTypeBinary
End Sub

Sub SetImage(Field, ImageFileName)
	ADO_Stream.Open

	MsgBox "Сейчас скушаю память..."
	ADO_Stream.LoadFromFile ImageFileName

	Do
		CurrentChunk = ADO_Stream.Read(10485760) ' Прочитать следующий кусок  10  Мб
		If Not IsNull(CurrentChunk) Then
			Field.AppendChunk(CurrentChunk)
		End If
	Loop Until IsNull(CurrentChunk)
	
	ADO_Stream.Close
End Sub

InitADO

ADO_Command.CommandText = "IF OBJECT_ID('TestBLOB') IS NOT NULL" _
		&vbCrLf &vbTab &"DROP TABLE TestBLOB" _
		&vbCrLf &"CREATE TABLE TestBLOB(" _
		&vbCrLf &vbTab &"Bin image)"

ADO_Command.Execute

' Заполнить колонки RecordSet
SQL_Query = "SELECT * FROM TestBLOB" _
		&vbCrLf &"WHERE 0 = 1"

ADO_Recordset.Open SQL_Query
ADO_Recordset.AddNew
Set Field = ADO_Recordset.Fields("Bin")

SetImage Field, FullFileName

ADO_Recordset.Update
ADO_Recordset.Close
ADO_Connection.Close

Вопрос, можно ли в процедуре SetImage вместо строк
Код: plaintext
1.
2.
3.
ADO_Stream.Open
MsgBox "Сейчас скушаю память..."
ADO_Stream.LoadFromFile ImageFileName

Написать
Код: plaintext
1.
ADO_Stream.Open "Какое-то имя файла"

И какое имя нужно написать, чтобы он понял, что надо открыть файл "D:\BigFile.dat"
...
Рейтинг: 0 / 0
13.12.2006, 14:10
    #34196596
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To buser
buserА нет способа из vbs читать файл кусками? Да и форумом Вы промахнулись :)

Более точно вопрос звучит так: "Возможно ли прочитать файл кусками на VBS, используя объект ADO Stream ? И если да, то как?"
...
Рейтинг: 0 / 0
13.12.2006, 16:59
    #34197427
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
RMihБолее точно вопрос звучит так: "Возможно ли прочитать файл кусками на VBS, используя объект ADO Stream ? И если да, то как?"
НЭТ
...
Рейтинг: 0 / 0
13.12.2006, 17:05
    #34197452
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To buser
ОК, тогда действительно мне не в этот форум
...
Рейтинг: 0 / 0
14.12.2006, 10:00
    #34198736
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
используйте доступ к файлам

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    Dim lngCount As Long
    Dim data() As Byte
    
    ReDim data( 99 )
    
    Open "d:\testIn.dat" For Binary Access Read As # 1  Len =  100 
    Open "d:\testOut.dat" For Binary Access Write As # 2 

    lngCount =  1    'с начала файла

    While Not EOF(1)
        Get #1, lngCount, data
        Put #2, lngCount, data
        
        ReDim data(99)         'очищаем массив
        lngCount = lngCount +  100 
    Wend
    
    Close # 2 
    Close # 1 

токо надо продумать, чтобы лишние байты в конец не писались (хотя это может и не помешать)
I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
14.12.2006, 10:40
    #34198905
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To HandKot

У меня Visual Basic Script, а не Visual Basic
...
Рейтинг: 0 / 0
14.12.2006, 12:33
    #34199467
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
ну тогда попробуйте использовать TextStream
и читать частями


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
14.12.2006, 13:11
    #34199687
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   Const ForReading =  1 , ForWriting =  2 , ForAppending =  8 
   Dim fso, fIn, fOut, data
   Set fso = CreateObject("Scripting.FileSystemObject")

   Set fIn = fso.OpenTextFile("d:\testIn.dat", ForReading)
   Set fOut = fso.OpenTextFile("d:\testOut.dat", ForWriting, True)

   Do While fIn.AtEndOfStream <> True
      data = fIn.read( 100 )
      fOut.Write(data)
   Loop
   fIn.Close
   fOut.Close
I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
14.12.2006, 13:53
    #34199942
RMih
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Stream
To HandKot
Спасибо, так работает. Оказывается с помощью объекта TextStream можно и двоичные файлы читать и записывать.

Всем спасибо :-)
Тема закрыта
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO Stream / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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