2013-05-03 99 views
0

在使用本機表的FoxPro中,我通常在插入新數據時執行此操作。使用Foxpro將數據插入MYSQL

Sele Table 
If Seek(lcIndex) 
    Update Record 
Else 
    Insert New Record 
EndIf 

如果我將使用MySQL作爲我的數據庫,什麼是使用SPT來 最好和最快的方式做到這一點在FoxPro代碼?我將更新大量的記錄。 最多80,000筆交易。

感謝, 赫伯特

回答

0

您可以在您的Visual FoxPro應用程序中使用SQL通過。查看用於連接到數據庫的SQLCONNECT()或SQLSTRINGCONNECT()。另請參閱SQLEXEC()來執行您的SQL語句。

例如:

myValue = 'Test' 
myHandle = SQLCONNECT('sqlDBAddress','MyUserId','MyPassword') 
myStatement = "UPDATE [MySchema].[Mytable] SET myField = '" + myValue + "' WHERE myPk = 1" 
=SQLEXEC(myHandle, myStatement,"myCursor") 
=SQLEXEC(myHandle, "SELECT * FROM [MySchema].[Mytable] WHERE myPk = 1","myCursor") 
SELECT myCursor 
BROWSE LAST NORMAL 
1

我將只需要傑裏提供什麼一步。當試圖處理任何插入,更新,刪除和SQL傳遞時,它會根據SQL注入的相似原理運行成可怕的調試問題。

如果您的「myValue」字段有單引號,雙引號,雙連字符(表示註釋),該怎麼辦?你會被打倒。

參數化您的語句,如使用VFP變量引用,然後使用「?」在你的sql語句中定義應該使用哪個「值」。 VFP正常通過。這也有助於數據類型,例如在構建「myStatement」時將數字轉換爲字符串。

此外,VFP,可以使用文本/ ENDTEXT簡化命令的可讀性

lcSomeStringVariable = "My Test Value" 
lnANumericValue = 12.34 
lnMyIDKey = 389 


TEXT to lcSQLCmd NOSHOW PRETEXT 1+2+8 
    update [YourSchems].[YourTable] 
     set SomeTextField = ?lcSomeStringVariable, 
      SomeNumberField = ?lnANumericValue 
     where 
      YourPKColumn = ?lnMyIDKey 
ENDTEXT 

=sqlexec(yourHandle, lcSQLCmd, "localCursor") 
0

這將是SQLEXEC您的語句字符串:

INSERT INTO SOMETABLE 
SET KEYFIELD = ?M.KEYFIELD, 
FIELD1 = ?M.FIELD1 
... 
FIELDN = ?M.FIELDN 
ON DUPLICATE KEY UPDATE 
FIELD1 = ?M.FIELD1 
... 
FIELDN = ?M.FIELDN 

注意,對重複KEY UPDATE部分不包含關鍵字段,否則它通常與插入相同(或者,如果你想在記錄已經存在時做其他事情)