2017-01-19 5 views
4

Iam пытается вставить данные из StringGrid в таблицу Oracle DB, для которой я пробовал, как показано ниже.Delphi Вставить данные из StringGrid в таблицу базы данных

function TfrmMapping.LoadtoTable: Boolean; 
var 
    I, J: Integer; 
    lQuery, s: string; 
    lData: TArray<string>; 
begin 

    for I := 0 to vTableColumns.count - 1 do 
    begin 
    if I <> vTableColumns.count - 1 then 
    begin 
     s := s + vTableColumns[I] + ','; 
    end 
    else 
    begin 
     s := s + vTableColumns[I]; 
    end; 
    end; 

    for I := 1 to StrGrdLoadCSVData.RowCount - 1 do 
    begin 
    vSortedGrid.Add(StrGrdLoadCSVData.Rows[I].CommaText); 
    end; 

    for I := 0 to vSortedGrid.count - 1 do 
    begin 
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values(' + 
     vSortedGrid[I] + ')'; 
    DataModSample.FDQuery1.SQL.Clear; 
    DataModSample.FDQuery1.SQL.Add(lQuery); 
    DataModSample.FDQuery1.ExecSQL; 
    end; 
    Result := True; 
end; 

В коде, И добавляя все данные StringGrid (StrGrdLoadCSVData) к StringList (vSortedGrid), а теперь IAM пытается петля через StringList добавить каждую строку в БД, но Iam не в состоянии вставить, потому что мои принимают значения, как этого

Insert into abc(sno,Name)values(1,welcome); 

это происходит потому, что нет цитат на welcome он дает ошибку.

это ошибка, как это: [FireDAC][Phys][Ora]ORA-00984:column not allowed here

Как я могу изменить мой код для вставки данных успешно Дб.

EDIT

Моя таблица структура:

Name   Type 
--------- ------------ 
SNO   NUMBER(38) 
NAME   VARCHAR2(15) 

мой желаемый результат в таблице должно быть так:

 SNO NAME 
---------- ---------- 
     1 Hello 
     2 Welcome 

Значения в таблице пришедшего из строки Список

+0

Используйте 'QuotedStr()' ' – Sami

+0

'Вставить в аЬс (SNO, NAME) значения (' '1, добро пожаловать '') '', если я использую Quotedstr, он получает такие значения, как ' [FireDAC] [Phys] [Ora] ORA-00947: недостаточно значений , если нет котировки, это ошибка: '[FireDAC] [Phys] [Ora] ORA-00984: здесь не разрешена колонка – userhi

+0

Вы можете попробовать мой ответ. – Sami

ответ

2

Я изменил код, как показано ниже

function TfrmMapping.LoadtoTable: Boolean; 
var 
    I, J: Integer; 
    lQuery, s, lcolvalues: string; 
begin 

    for I := 0 to vTableColumns.count - 1 do 
    begin 
    if I <> vTableColumns.count - 1 then 
    begin 
     s := s + vTableColumns[I] + ','; 
    end 
    else 
    begin 
     s := s + vTableColumns[I]; 
    end; 
    end; 

    for I := 1 to StrGrdLoadCSVData.RowCount - 1 do 
    begin 
    for J := 0 to vTableColumns.count - 1 do 
    begin 
     if J <> vTableColumns.count - 1 then 
     begin 
     lcolvalues := lcolvalues + 
      QuotedStr(StrGrdLoadCSVData.Cells[J, I]) + ','; 
     end 
     else 
     begin 
     lcolvalues := lcolvalues + QuotedStr(StrGrdLoadCSVData.Cells[J, I]); 
     end; 
    end; 
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values (' + 
     lcolvalues + ')'; 
    DataModSample.FDQuery1.SQL.Clear; 
    DataModSample.FDQuery1.SQL.Add(lQuery); 
    DataModSample.FDQuery1.ExecSQL; 

    lcolvalues := ''; 
    end; 
    Result := True; 
end; 

Это вставив значения таблицы из строки сетки, я не использовал передачу параметров, как сейчас. Я должен попробовать это также для обеспечения большей безопасности.

Спасибо @Sami, купить с помощью концепции FDQuery я получил эту идею ...

+1

Удачи, все, что я могу сказать, я прихожу к SO, чтобы помочь другим, как я могу, и учиться у них, вот и вся жизнь. Всего каждый достигает большего ** (КОМАНДА) **. – Sami

2

Это потому, что нет цитат, чтобы приветствовать, что это дает ошибку.

Так от того, что вы говорите:

for I := 0 to vSortedGrid.count - 1 do 
    begin 
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values('+IntToStr(i+1)+',' + 
     QuotedStr(vSortedGrid[I]) + ')'; 
    DataModSample.FDQuery1.SQL.Clear; 
    DataModSample.FDQuery1.SQL.Add(lQuery); 
    DataModSample.FDQuery1.ExecSQL; 
    end; 
    Result := True; 
end; 

Примечание: Лучше использовать parameters.

Update:

Еще один вариант вставки из TStringGrid с помощью TFDTable:

procedure TForm1.Button2Click(Sender: TObject); 
Var I : Integer; 
begin 

for i := 1 to StringGrid1.RowCount-1 do 

    begin 
    try 
     FDTable1.Append; 
     FDTable1SNO.Value := StrToInt(StringGrid1.Cells[0,i]); 
     FDTable1SName.Value := StringGrid1.Cells[1,i]; 
     FDTable1.Post; 
     except on E: Exception do 
     begin 
     MessageDlg(E.Message,mtError,[mbOK],0); 
     MessageBeep(MB_ICONERROR); 
     end; 
    end; 
end; 

Другой вариант вставки из TStringGrid с помощью TFDQuery (избежать SQL Injection):

procedure TForm1.Button1Click(Sender: TObject); 
Var I : Integer; TableName : String; 
begin 

TableName := 'Table1'; 

for i := 1 to StringGrid1.RowCount-1 do 

    begin 
    try 
     FDQuery1.SQL.Text := 'Insert Into '+TableName+' Values(:Val1 , :Val2)' ; 
     FDQuery1.Params.ParamByName('Val1').Value := StrToInt(StringGrid1.Cells[0,i]); 
     FDQuery1.Params.ParamByName('Val2').Value := StringGrid1.Cells[1,i]; 
     FDQuery1.ExecSQL; 
    except on E: Exception do 
     begin 
     MessageDlg(E.Message,mtError,[mbOK],0); 
     MessageBeep(MB_ICONERROR); 
     end; 
    end; 

Вы также можете указать Create parameters ПЕД в Runtime для Exemple:

FDQuery1.Params.CreateParam(ftString,'ParamName',ptInput) ; 

Также вы можете использовать GetTableNames(), чтобы получить все таблицы в Database.

+0

''Вставить в значения abc (SNO, NAME) (1, '' 1, welcome '') '' ' SNO NAME ---------- ----------- 1 1, Welcome ' Это вставка как выше, но я хочу как это SNO NAME ---------- ----------- 1 добро пожаловать – userhi

+0

Я не понимаю, что вы подразумеваете под этим, Поэтому, пожалуйста, отредактируйте свой вопрос и добавьте структуру таблицы и ожидаемое восстановление. – Sami

+0

проверьте, я обновил вопрос. – userhi

Смежные вопросы