Быстрая работа с MySQL

Delphinarium
Дата: 18.11.2007 14:42:47
Уважаемый алл!

Подскажите как убыстрить работу с MySQL базой из дельфи? Сама задача - экспорт из экселя в БД Мускуля.

Сначала сделал так:
for j := i to i1 do
begin
ztDefected.Insert;
ztDefectedName.Value := Sheet.Cells[j,j1];
ztDefectedProducer.Value := Sheet.Cells[j,j2];
ztDefectedSeries.Value := Sheet.Cells[j,j3];
ztDefectedDocument.Value := Sheet.cells[j,j4];
ztDefectedNotes.Value := Sheet.cells[j,j5];
ztDefected.Post;
end;

Работает, но очень медленно.... На объемах больше 400 записей вообще выдает сообщения что утеряно соединение с сервером.

Попытался сделать через запросы:
for j := i to i1 do

zquery1.SQL.Add('INSERT INTO defected VALUES ('+QuotedStr(Sheet.Cells[j,j1])+','+QuotedStr(Sheet.Cells[j,j2])+','+QuotedStr(Sheet.Cells[j,j3])+','+QuotedStr(Sheet.Cells[j,j4])+','+QuotedStr(Sheet.Cells[j,j5])+');');

Zquery1.ExecSQL;

Ругается на синтаксис запроса при исполнении...

В данных есть строки содержащие кавычки. Но первый метод ест их легко, второй видно на них и спотыкается.

Какие еще способы есть чтобы работало все быстро как только можно?
Anatoly Podgoretsky
Дата: 18.11.2007 14:45:23
Для начала используй параметры, особенно для строк и дат, да и с числами поосторожней.


Posted via ActualForum NNTP Server 1.4

Delphinarium
Дата: 18.11.2007 14:46:18
Примерчик киньте для моего случая плиз...
Anatoly Podgoretsky
Дата: 18.11.2007 14:48:00
Примеры есть в справке, да и поиск миллионы ссылок выкинет.
Это же супер боян.
Delphinarium
Дата: 18.11.2007 14:49:56
Я пробую как написано в супер-боянах но что то не идет... Если вас не затруднит, будьте любезны помогите =) именно для моих переменных
Anatoly Podgoretsky
Дата: 18.11.2007 14:50:39
Значит неправильно пишешь или движок у тебя неправильный.
Delphinarium
Дата: 18.11.2007 14:53:56
Спасибо за содержательную и полезную помощь. Надеюсь вам будут также помогать как вы мне и вы будете очень признательны им за это.
Anatoly Podgoretsky
Дата: 18.11.2007 14:59:27
Спасибо Гигант мысли.
sanich
Дата: 18.11.2007 16:01:50
Delphinarium
Уважаемый алл!

Подскажите как убыстрить работу с MySQL базой из дельфи? Сама задача - экспорт из экселя в БД Мускуля.

Сначала сделал так:
for j := i to i1 do
begin
ztDefected.Insert;
ztDefectedName.Value := Sheet.Cells[j,j1];
ztDefectedProducer.Value := Sheet.Cells[j,j2];
ztDefectedSeries.Value := Sheet.Cells[j,j3];
ztDefectedDocument.Value := Sheet.cells[j,j4];
ztDefectedNotes.Value := Sheet.cells[j,j5];
ztDefected.Post;
end;

Работает, но очень медленно.... На объемах больше 400 записей вообще выдает сообщения что утеряно соединение с сервером.

Попытался сделать через запросы:
for j := i to i1 do

zquery1.SQL.Add('INSERT INTO defected VALUES ('+QuotedStr(Sheet.Cells[j,j1])+','+QuotedStr(Sheet.Cells[j,j2])+','+QuotedStr(Sheet.Cells[j,j3])+','+QuotedStr(Sheet.Cells[j,j4])+','+QuotedStr(Sheet.Cells[j,j5])+');');

Zquery1.ExecSQL;

Ругается на синтаксис запроса при исполнении...

В данных есть строки содержащие кавычки. Но первый метод ест их легко, второй видно на них и спотыкается.

Какие еще способы есть чтобы работало все быстро как только можно?


тормоза из-за того что ты считываешь данные из эксела построчно.
Ускорить мона применением диапазонов.

Считал диапазон, обработал в делфе проинсертил в мускуль
sanich
Дата: 18.11.2007 16:05:02
вот пример как считать диапазон

Как импортировать данные из Excel в StringGrid 
--------------------------------------------------------------------------------

uses
  ComObj;

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;

    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;

    // Set Stringgrids row &col dimensions.

    AGrid.RowCount := x;
    AGrid.ColCount := y;

    // Assign the Variant associated with the WorkSheet to the Delphi Variant

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      // XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Xls_To_StringGrid(StringGrid1, 'C:\Table1.xls') then
    ShowMessage('Table has been exported!');
end;