2012-12-05 63 views
2

我正在Delphi中開發一個應用程序,並希望將記錄插入到Mysql的表中。 然後我想知道插入的記錄的身份值。所以我寫了下面的代碼。
在運行時,插入完成並添加記錄,但返回的身份值爲零! 我的錯誤是什麼?delphi dxExpress MySQL:無效LAST_INSERT_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; 

有什麼建議嗎?

回答

0

顯然this is a problem known with delphi

引用上面的鏈接:

某些ODBC應用程序(包括德爾福和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; 
+0

我測試了上面的代碼,並返回null(自然應該返回null,如上面的請求)。現在,我怎樣才能得到最後插入的記錄的ID? –

+1

@MohTarvirdi:您必須將sql_auto_is_null標誌設置爲1.更多信息請參見此處:http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sql_auto_is_null – whosrdaddy

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我njection

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; 
+0

+1使用參數 – whosrdaddy

+0

我測試過並得到語法錯誤 –

+0

@MohTarvirdi有什麼樣的錯誤?從SQL編譯或運行時?請引用整個錯誤消息。你測試了什麼?有或沒有參數? –

相關問題