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

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

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

что-нибудь в этом роде?
...
Рейтинг: 0 / 0
01.09.2017, 06:18:02
    #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
01.09.2017, 06:19:36
    #39513771
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генераторов скриптов на инсерт из датасета
AX-Classandreymx,

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

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

что мешает пробежаться по датасету и подставить значения в параметры?
...
Рейтинг: 0 / 0
01.09.2017, 11:42:36
    #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
01.09.2017, 11:43:19
    #39513955
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генераторов скриптов на инсерт из датасета
имя таблицы задаю
имена полей из датасета
...
Рейтинг: 0 / 0
01.09.2017, 18:17:47
    #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
02.09.2017, 22:57:56
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Генераторов скриптов на инсерт из датасета / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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