在 FoxPro 中使用本机表时,我通常在插入新数据时这样做。
Sele Table
If Seek(lcIndex)
Update Record
Else
Insert New Record
EndIf
如果我将使用 MYSQL 作为我的数据库,在 FoxPro 代码中使用 SPT 执行此操作的最佳和最快方法是什么?我将更新大量记录。最多 80,000 笔交易。
谢谢,赫伯特
我只会把杰瑞提供的更进一步。当试图处理任何使用 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" )
您可以在 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
这将是您的 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 部分不包含键字段,否则它通常与插入相同(或者,如果您想在记录已经存在时执行其他操作)