![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStringList в таблицу [D6, Access]
ПИТОН © (2002-10-09 14:45:00)Есть данные в TStringList (порядка 3500).
Подскажите плииз, как можно быстро эти данные запхать в таблицу.
В таблице только 1 поле.
(БД - Access 2000, MS Jet 4.0)
ЮЮ (2002-10-10 12:19:00) [1]через (ж..) или Jet ? :-)
А затащить из файла в память и затем пытаться писать построчно, даже не в одной транзакции, это нормально, это не через ж...
ПИТОН (2002-10-10 12:10:00) [2]Кстати, через (ж..) текстовый файл таже операция занимает около 1 секунды. Во как!
sniknik (2002-10-10 12:08:00) [3]спасибо. действительно работает, действительно полезныйсовет.
still (2002-10-10 11:53:00) [4]
> sniknik © (10.10.02 11:05)
> при копировании ид дельфей всегда так а через блокнот или
> др. в лом. но там просто пост из форума, взял для примера
> данные для мемо поля. возьми другие.
ПОЛЕЗНЫЙ СОВЕТ:
чтобы такого не было, нужно перед операцией копирования в делфях перейти на русский язык. т.е. переключить раскладку, а затем уж Ctrl+Ins (Ctrl+C - кому как нравится)
sniknik (2002-10-10 11:50:00) [5]2 ЮЮ © (10.10.02 11:23)
наверно ты прав 3500 с одним полем 1мин 5сек. можно списать на разницу в машинах.
sniknik (2002-10-10 11:37:00) [6]Serezhka (10.10.02 11:22)
при условии что подключены через jet (можно в принципе и кривым путем ODBC, BDE но в конце все одно должен быть jet, это его фенечка)
в общеи подключение по строке
ADOConnection1.ConnectionString:= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyBase.Mdb;Persist Security Info=False";
тогда запрос типа
SELECT * INTO CLIENTS FROM [Text;DATABASE=D:\].[CLIENTS#TXT]
выполненный через ADOCommand например сделает и положит в таблицу данные из CLIENTS.TXT
INSERT INTO соответственно добивит и.тд.
текстовый файл должен быть в формате CSV (как Эксель выгружает) типа
"ИндексКлиента";"CLSTNM"
1;"Черт знает что!"
первая строка поля остальное данные, лутше посмотреть выгрузку Экселя, там и мемо поля возможны!
ЮЮ (2002-10-10 11:23:00) [7]1300 за 36сек не быстрее чем 3500 за 1.5 минуты :-)
И чем тебе 1.5 минуты не нравятся? Или ты каждый раз при открытии программы этим занимаешься? :-)
Serezhka (2002-10-10 11:22:00) [8]
> sniknik ©
> сделать то можно и из файла и путь ему любой задавать, но
> это будет извращение (в смысле отказ от операций в памяти
> в пользу дисковых, считаю извратом). если только как академический
> интерес то могу помоч.
Помоги мне плизззззззззз, просто интересно как?
sniknik (2002-10-10 11:05:00) [9]при копировании ид дельфей всегда так а через блокнот или др. в лом. но там просто пост из форума, взял для примера данные для мемо поля. возьми другие.
ПИТОН (2002-10-10 10:59:00) [10]
> sniknik ©
спасибо.
Только коидировка глючит
sniknik (2002-10-10 10:56:00) [11]вот эта хрень ложится в таблицу за 36сек. 1300 записей 5 стринговых полей и 5 мемо. переделай под себя. с одниим полем всяко быстрей будет.
procedure TForm1.Button3Click(Sender: TObject);
const InsRepeat = 1300;
var i, n: integer;
begin
if not ADODataSet1.Active then begin
ADOConnection1.Connected:= False;
ADOConnection1.ConnectionString:= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyBase.Mdb;Persist Security Info=False";
ADODataSet1.Close;
ADODataSet1.CommandText:= "MyTable";
ADODataSet1.Open;
end;
ADODataSet1.DisableControls;
for n:= 1 to InsRepeat do begin
ADODataSet1.Append;
for i:= 1 to 5 do
ADODataSet1.Fields[i].AsString:= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyBase.Mdb;Persist Security Info=False";
for i:= 6 to 10 do
ADODataSet1.Fields[i].AsString:=
"
ПИТОН (2002-10-10 10:54:00) [12]
> sniknik © (10.10.02 10:32)
> как ты однако повернул, с одного поля на каждую запись.
Поле действительно 1. А записей 3500
Max Zyuzin (2002-10-10 10:42:00) [13]Можно попробовать все загнать во временную таблицу в памяти, а потом одним запром запихать в базу. (но это ИМХО левой ногой через правое плечо...)
ПИТОН (2002-10-10 10:38:00) [14]
For i := 0 To Lst.Count-1 Do
Table.Appendrecord(Lst[i]);
Или
For i := 0 To Lst.Count-1 Do
begin
Query.SQL.Add(Format("INSERT INTO table (Field1) Values (%s)",[Lst[i]]);
Query.ExecSQL
end;
sniknik (2002-10-10 10:32:00) [15]как ты однако повернул, с одного поля на каждую запись.
сделать то можно и из файла и путь ему любой задавать, но это будет извращение (в смысле отказ от операций в памяти в пользу дисковых, считаю извратом). если только как академический интерес то могу помоч.
а лутше
В цикле, построчносм. ^up. Anatoly Podgoretsky © (10.10.02 09:42)
код как ложиш приведи.
ПИТОН (2002-10-10 10:26:00) [16]
> Anatoly Podgoretsky © (10.10.02 09:42)
> В цикле, построчно
1.5 минуты
Anatoly Podgoretsky (2002-10-10 09:42:00) [17]В цикле, построчно
ПИТОН (2002-10-10 09:36:00) [18]Да мне желательно что-бы каждая строка из ТСтрингЛиста была отдельной записью.
Тут пробовал сохранять ТСтрингЛист в текст, а потом в Аксессе делать ссылку на него, но не хочу быть привязанным к постоянному пути+имя файла, а как сделать, чтобы изменить путь к ссылке в самомо аксессе или сздать базу типа
SELECT ... INTO ... FROM File.txt не знаю.
Может кто поможет?
sniknik (2002-10-09 17:45:00) [19]посчитай скоко это будет в байтах.
тип memo(Text) в Access принимает (по разным источникам в одном и том же хелпе ;o)
1
Memo data type
A field data type. Such fields can contain up to 1.2 GB of text data.
2
TEXT 2 байта на знак (см. «Примечания») От 0 до 2,14 Гбайт.
склонен верить первому по второму сомнительно (весь mdb максимум 2g)
лутше всетаки текстом. можеш запихать все одной коммандой как textdelimeted. и поиск потом всетаки будет возможен. (не знаю как с блоб)
у блоба кстати размеры те же по одному месту в хелпе одни по др. см. выше.
{bas} (2002-10-09 16:28:00) [20]Н знаю, как остальные, а я бы делал через BLOB поле
P.S. работаю с Oracle, но думаю что и с Access прокатит