2

Delphi でアプリケーションを開発しており、Mysql のテーブルにレコードを挿入したいと考えています。次に、挿入されたレコードの ID 値を知りたいです。だから私は以下のコードを書きます。
実行時に、挿入が行われ、レコードが追加されますが、id の戻り値はゼロです!! 私の間違いは何ですか?!!

-- MySql  table create
CREATE TABLE Sample_Table (
  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  mobile_number varchar(20) DEFAULT NULL,
  message_body text,
 PRIMARY KEY (id)
);

--- Delphi code

SQLCon := TSQLConnection.Create(self);
  with SQLCon do begin
   Close;
   DriverName := 'MySQL';
   GetDriverFunc := 'getSQLDriverMYSQL';
   LibraryName := 'dbxmys.dll';
   VendorLib := 'LIBMYSQL.dll';
   LoginPrompt := false;
   Params.Values['HostName'] := '127.0.0.1';
   Params.Values['Database'] := 'sms_test';
   Params.Values['User_Name'] := 'root';
   Params.Values['Password'] := 'root';
   Open;
end;

SQLQry := TSQLQuery.Create(self);
with SQLQry do begin
  Close;
  SQLConnection := SQLCon;

  SQL.Clear;
  SQL.Add('INSERT INTO Sample_Table ');
  SQL.Add('(mobile_number, message_body) VALUES');
  SQL.Add(format('(%s, %s);',[QuotedStr('989121011689'), QuotedStr('Text1')]));
  ExecSQL();
  Close;

  SQL.Clear;
  SQL.Add('SELECT LAST_INSERT_ID() EngineRefNo;');
  Open;
  First;
  ListBox1.items.Add(FieldByName('EngineRefNo').AsString);
  Close;
end;

SQLCon.Close;

何かアドバイスはありますか?

4

2 に答える 2

3

IDを一気に取得する必要があります

SQLQry := TSQLQuery.Create(self);
with SQLQry do begin
  SQLConnection := SQLCon;

  SQL.Add('INSERT INTO Sample_Table ');
  SQL.Add('(mobile_number, message_body) VALUES');
  SQL.Add(format('(%s, %s);',[QuotedStr('989121011689'), QuotedStr('Text1')]));

  SQL.Add('SELECT LAST_INSERT_ID() EngineRefNo;');

  Open;
  ListBox1.items.Add(FieldByName('EngineRefNo').AsString);
  Close;
end;

SQLCon.Close;

パラメータを使用してSQLインジェクションを防ぐことを検討する必要があります

SQLQry := TSQLQuery.Create(self);
with SQLQry do begin
  SQLConnection := SQLCon;

  SQL.Add('INSERT INTO Sample_Table ');
  SQL.Add('( mobile_number, message_body ) VALUES');
  SQL.Add('( :mobile_number, :message_body );');

  SQL.Add('SELECT LAST_INSERT_ID() EngineRefNo;');

  ParamByName( 'mobile_number' ).Value := '989121011689';
  ParamByName( 'message_body' ).Value := 'Text1';

  Open;
  ListBox1.items.Add(FieldByName('EngineRefNo').AsString);
  Close;
end;

SQLCon.Close;
于 2012-12-05T23:38:16.177 に答える
0

どうやらこれは delphi で知られている問題です

上記のリンクを引用:

特定の ODBC アプリケーション (Delphi および Access を含む) では、前の例を使用して自動インクリメント値を取得する際に問題が発生する場合があります。この場合、代わりに次のステートメントを試してください。

SELECT * FROM tbl WHERE auto IS NULL;

この代替方法では、sql_auto_is_null 変数が 0 に設定されていないことが必要です。サーバー システム変数を参照してください。

したがって、あなたの場合(テストされていません):

SQLCon := TSQLConnection.Create(self);
  with SQLCon do begin
   Close;
   DriverName := 'MySQL';
   GetDriverFunc := 'getSQLDriverMYSQL';
   LibraryName := 'dbxmys.dll';
   VendorLib := 'LIBMYSQL.dll';
   LoginPrompt := false;
   Params.Values['HostName'] := '127.0.0.1';
   Params.Values['Database'] := 'sms_test';
   Params.Values['User_Name'] := 'root';
   Params.Values['Password'] := 'root';
   Open;
end;
SQLQry := TSQLQuery.Create(self);
with SQLQry do begin
  Close;
  SQLConnection := SQLCon;

  SQL.Clear;
  SQL.Add('INSERT INTO Sample_Table ');
  SQL.Add('(mobile_number, message_body) VALUES');
  SQL.Add(format('(%s, %s);',[QuotedStr('989121011689'), QuotedStr('Text1')]));
  ExecSQL();
  Close;

  SQL.Clear;
  SQL.Add('SELECT id FROM Sample_Table WHERE id IS NULL');
  Open;
  First;
  ListBox1.items.Add(FieldByName('Id').AsString);
  Close;
end;

SQLCon.Close;
于 2012-12-05T22:13:25.070 に答える