在使用本机表的FoxPro中,我通常在插入新数据时执行此操作。
Sele Table
If Seek(lcIndex)
Update Record
Else
Insert New Record
EndIf
如果我将MYSQL用作我的数据库,那么最好和最快的方法是什么 使用SPT在FoxPro代码中执行此操作?我将更新大量记录。 最多80,000笔交易。
谢谢, 赫伯特
答案 0 :(得分:1)
我只会采取杰里提供的更进一步。当尝试处理任何插入,更新,删除与SQL传递,它可能会遇到基于SQL注入的类似原则的可怕的调试问题。
如果您的“myValue”字段有单引号,双引号,双连字符(表示注释)怎么办?你会被软管。
参数化您的语句,例如使用VFP变量引用,然后使用“?”在你的sql语句中限定应该使用哪个“值”。 VFP正确通过。这也有助于数据类型,例如在构建“myStatement”时将数字转换为字符串。
此外,在VFP中,您可以使用TEXT / 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" )
答案 1 :(得分:0)
您可以在Visual Foxpro应用程序中使用SQL Pass through。查看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
答案 2 :(得分: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
请注意,ON DUPLICATE KEY UPDATE部分不包含键字段,否则它通常与插入相同(或者,如果您想在记录已存在时执行其他操作,则不会)