2013-05-03 2 views
0

기본 테이블을 사용하는 FoxPro에서 일반적으로 새 데이터를 삽입 할 때이 작업을 수행합니다. 내 데이터베이스로 MySQL을 사용할 경우Foxpro를 사용하여 MYSQL에 데이터 삽입

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

는 에 가장 빠른 방법은 SPT를 사용하여 FoxPro에 코드에서이 작업을 수행 무엇인가? 많은 수의 레코드를 업데이트 할 예정입니다. 최대 80,000 건의 거래.

감사합니다, 허버트

답변

0

당신은 당신의 비주얼 폭스 프로 응용 프로그램을 통해 SQL 패스를 사용할 수 있습니다. 데이터베이스에 연결하기위한 SQLCONNECT() 또는 SQLSTRINGCONNECT()를 살펴보십시오. 또한 SQL 문을 실행하기 위해 SQLEXEC()을 살펴보십시오. 예를 들어

: 난 단지 제리가 한 단계 더 공급 무엇 걸릴 것

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 문에서 "value"를 사용해야하는지 확인하십시오. 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") 
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 부분은 키 필드를 포함하지 않습니다. 그렇지 않으면 일반적으로 삽입과 동일합니다 (또는 레코드가 이미 존재할 때 다른 작업을 수행하려는 경우)

관련 문제