powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Генераторов скриптов на инсерт из датасета
11 сообщений из 11, страница 1 из 1
Генераторов скриптов на инсерт из датасета
    #39513713
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Генераторов скриптов на инсерт из произвольного датасета.
Может, у кого завалялся рабочий и не жалко поделиться?
Мне для инсертов в MS SQL, но можно и универсальный.

Мог бы и сам написать, но время на работе занято брифингами, митингами и прочей фигнёй, а дома и сил уже нет.
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513751
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Специфичная задача. "инсерт из произвольного датасета" это, когда мы генерим датасет всякими LocalSQL, правим, потом создаем таблицу на сервере и туда пушим?
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513755
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это типа как в одаке?
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513767
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

что-нибудь в этом роде?
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513769
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaratIskandreymx,

что-нибудь в этом роде?да, почти похоже
только скрипт хочу формировать по всем строкам датасета с подставленными значениями
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function BuildInsert(DataSet: TDataSet; TableName: string): string;
var
  s1, s2, s3 : string;
  i          : Integer;
  FieldName  : string;
begin
  for i := 0 to DataSet.Fields.Count -1 do begin
    FieldName := DataSet.Fields[i].FieldName;
    if not VarIsNull(DataSet.FindField(FieldName).Value) then begin
      s1 := s1 + FieldName + ', ';
      s2 := s2 + ':' + FieldName + ', ';тут надо значение в нужном формате, скажем для MS SQL дат в виде '{d ''2017-02-01''}'
    end else begin
      s1 := s1 + FieldName + ', ';
      s2 := s2 + 'NULL, ';
    end; // if not VarIsNull(DataSet.Fields[i].Value)
  end; // for i := 0 to FieldList.Count
  SetLength(s1, Length(TRIM(s1))-1);
  SetLength(s2, Length(TRIM(s2))-1);
  s3 := 'INSERT INTO ' + TableName + ' (' + s1 + ') ' +
        'VALUES (' + s2 + ')';
  Result := s3;
end;
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513771
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-Classandreymx,

Специфичная задача. "инсерт из произвольного датасета" это, когда мы генерим датасет всякими LocalSQL, правим, потом создаем таблицу на сервере и туда пушим?если я тебя правильно понял, то да

Нужен из произвольного датасета набор инсертов по каждой строке по выбранным полям
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513944
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

что мешает пробежаться по датасету и подставить значения в параметры?
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513954
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaratIsk,

нужен готовый скрипт
который можно сохранить и через какое-тов ремя выполнить

пример от мускуля
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (1,  1, 1, '2009-02-12 16:41:30', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (2,  1, 1, '2009-02-12 16:43:34', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (3,  1, 1, '2009-02-12 16:45:51', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (4,  1, 1, '2009-02-12 16:48:07', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (5, 64, 1, '2009-03-03 09:02:34', 'd1c07b5f3fb9322374174b86460e9fc2');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (6, 64, 1, '2009-03-03 09:09:43', 'd1c07b5f3fb9322374174b86460e9fc2');

что-то в таком виде
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39513955
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имя таблицы задаю
имена полей из датасета
...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39514255
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно набросал для старта
Код: pascal
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
type
  TDriverType = (dtOracle, dtFireBird, dtSQLite, dtMySQL, dtADO, dtDBF, dtABS, dtMSSQL, dtAccess);


function GetTextValue(Field : TField; DriverType: TDriverType): string;

begin

  result := '';

  case DriverType of
    dtOracle: ;

    dtMSSQL: begin
           if Field.IsNull then
           begin
              result := 'Null, ';
              exit;
           end;

           case Field.DataType of
              ftBoolean  : begin
                if Field.AsBoolean then
                begin
                  result := '1, ';
                end else
                begin
                  result := '0, ';
                end;
              end;
              ftSmallInt ,
              ftLargeint ,
              ftInteger  ,
              ftWord     ,
              ftAutoInc  : begin
                result := Field.AsString + ', ';
              end;
              ftBCD,
              ftFloat, ftCurrency    : begin
                result := StringReplace(Field.AsString, ',', '.', []) + ', ';
              end;
              ftDate     : begin
                result := '{''d'' ' + FormatDateTime('yyyy-mm-dd', Field.AsDateTime) + '}, ';
              end;
              // íà áóäóùåå ftTime      : ;

              ftDateTime : begin
                if Abs(MilliSecondsBetween(Field.AsDateTime, trunc(Field.AsDateTime))) < 1 then
                begin
                  result := '{d ''' + FormatDateTime('yyyy-mm-dd', Field.AsDateTime) + '''}, ';
                end else
                begin
                end;
                  result := '{ts ''' + FormatDateTime('yyyy-mm-dd hh:mm:ss', Field.AsDateTime) + '''}, ';
              end;
              {&#237;&#224; &#225;&#243;&#228;&#243;&#249;&#229;&#229;
              ftBlob : begin
                s := s + Field.FieldName + ' BLOB SUB_TYPE 0, ' + #13#10;
              end;
              ftMemo : begin
                s := s + Field.FieldName + ' BLOB SUB_TYPE 1, ' + #13#10;
              end;
              }
              ftWideString : begin
                result := 'N' + QuotedStr(Field.AsString) + ', ';
              end;
          else
            begin
                result := 'N' + QuotedStr(Field.AsString) + ', ';
            end;
          end; // case Field.DataType


    end;

    dtFireBird: ;

    dtMySQL:    ;

    dtSQLite:   ;

    dtADO:      ;

    dtDBF:      ;

  end; // case Driver of

end;


function BuildInsertScript(DataSet: TDataSet; DriverType : TDriverType; TableName: string; FieldList: TStringList = Nil): string;
var
  InsertSQL,
  ValuesSql  : string;
  i, Index   : Integer;
  FieldName  : string;
  FieldArray : array of integer;
  FieldAdd   : boolean;
begin
  SetLength(FieldArray, 0);
  InsertSQL := '';
  result := '';

  for i := 0 to DataSet.Fields.Count - 1 do
  begin
    FieldAdd := true;
    FieldName := DataSet.Fields[i].FieldName;
    if FieldList <> Nil then
    begin
      FieldAdd := FieldList.Find(FieldName, Index);
    end;
    if FieldAdd then
    begin
      InsertSQL := InsertSQL + FieldName + ', ';
      SetLength(FieldArray, Length(FieldArray) + 1);
      FieldArray[Length(FieldArray)-1] := i;
    end;
  end;
  InsertSQL := 'INSERT INTO ' + TableName + ' (' + copy(InsertSQL, 1, length(InsertSQL)-2) + ') ';

  DataSet.First;
  while not DataSet.Eof do
  begin
    ValuesSql := '';
    for i := 0 to Length(FieldArray) -1 do
    begin
      ValuesSql := ValuesSql + GetTextValue(DataSet.Fields[i], DriverType);
    end;
    result := result + InsertSQL + #13 +
              'VALUES (' + copy(ValuesSql, 1, length(ValuesSql)-2) + ');'#13;
    DataSet.Next;
  end;
  DataSet.first;
end;

результат
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO AUTO_TASK_DESCS (AUTO_TASK_DESC_ID, PARENT_AUTO_TASK_DESC_ID, OBJECT_TYPE_ID, NAME, DESCRIPTION,
SERVICE_ID, BURO_POST, BURO_PROG, ACTUALITY, STAT_INFO_INS, STAT_USER_INS, STAT_DATE_INS, STAT_INFO_UPD, STAT_USER_UPD, STAT_DATE_UPD, DATAN, DATAK, PR_FOLDER) 
VALUES (101, Null, 6, N'Рассылка по молоку', Null, Null, Null, Null, 0, N'evgeniy/(INS', Null, {ts '2015-07-16 10:54:25'}, Null, Null, Null, Null, Null, 0);
INSERT INTO AUTO_TASK_DESCS (AUTO_TASK_DESC_ID, PARENT_AUTO_TASK_DESC_ID, OBJECT_TYPE_ID, NAME, DESCRIPTION,
SERVICE_ID, BURO_POST, BURO_PROG, ACTUALITY, STAT_INFO_INS, STAT_USER_INS, STAT_DATE_INS, STAT_INFO_UPD, STAT_USER_UPD, STAT_DATE_UPD, DATAN, DATAK, PR_FOLDER) 
VALUES (122, 142, 4, N'Архивация БД', Null, Null, Null, Null, 1, N'andrey//(INS)', Null, {ts '2017-03-05 18:16:30'}, Null, Null, Null, Null, Null, 0);

...
Рейтинг: 0 / 0
Генераторов скриптов на инсерт из датасета
    #39514555
pgiw99oeo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxMaratIsk,

нужен готовый скрипт
который можно сохранить и через какое-тов ремя выполнить

пример от мускуля
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (1,  1, 1, '2009-02-12 16:41:30', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (2,  1, 1, '2009-02-12 16:43:34', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (3,  1, 1, '2009-02-12 16:45:51', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (4,  1, 1, '2009-02-12 16:48:07', '838ee4cf9bdca48e9d5d3bb9707f7ef1');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (5, 64, 1, '2009-03-03 09:02:34', 'd1c07b5f3fb9322374174b86460e9fc2');
INSERT INTO docs_sequence_1 (`id`, `user_id`, `used`, `date`, `SID`) VALUES        (6, 64, 1, '2009-03-03 09:09:43', 'd1c07b5f3fb9322374174b86460e9fc2');

что-то в таком виденепонятно с какой целью весь этот фокус проделывается
не проще ли локально сохранить строки целиком, или таблицу целиком со строками отмеченными к сохранению?
при необходимости обращаться к сохраненной таблице и вставлять из нее в базу отмеченные строки
а то можешь напахаться и выяснится что нужно совсем не это и не то имелось в виду
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Генераторов скриптов на инсерт из датасета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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