0

在 FoxPro 中使用本机表时,我通常在插入新数据时这样做。

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

如果我将使用 MYSQL 作为我的数据库,在 FoxPro 代码中使用 SPT 执行此操作的最佳和最快方法是什么?我将更新大量记录。最多 80,000 笔交易。

谢谢,赫伯特

4

3 回答 3

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" )
于 2013-05-03T14:38:37.533 回答
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
于 2013-05-03T13:14:03.133 回答
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 部分不包含键字段,否则它通常与插入相同(或者,如果您想在记录已经存在时执行其他操作)

于 2013-05-20T11:33:14.043 回答