2014-10-21 4 views
0

삽입 트리거가있는 FoxPro 테이블에 삽입하려고하면 '함수가 구현되지 않았습니다.'오류가 발생합니다. 테이블 설정 GUI. vs2012를 사용하여 데이터 세트 내에 테이블 어댑터를 만들었습니다. 아래에 표시된 업데이트 문을 추가했습니다. 삽입/업데이트를 수행하는 C# 프로젝트 내의 코드도 아래에 나열되어 있습니다. FoxPro 테이블에서 관련된 트리거를 제거하면 성공적인 삽입/업데이트를 얻을 수 있습니다. 트리거를 사용하면 삽입 및 업데이트에서 '함수가 구현되지 않음'오류가 발생합니다. 선택 작업은 문제가 없습니다. 테이블에 삽입, 업데이트 및 삭제 트리거가있는 경우 VFP OLEDB 9 함수가 구현되지 않았습니다.

FoxPro 테이블이 가진 utacc 삽입, 갱신 및 관련 SQL Server 테이블을 삭제하는 설정을 트리거 도와주세요. 게시물 하단에 트리거를 삽입하십시오.

VS 2012 테이블 어댑터 삽입 명령

INSERT INTO utacc 
         (fcmodid, fcuname, fccompid, fcacclvl, fcscope) 
VALUES  (?, ?, ?, ?, ?) 

C# 코드

이러한 트리거는 SQL 서버 테이블에 삽입 표 어댑터

using (var ta = new DataSet1TableAdapters.utaccTableAdapter()) 
{ 
    foreach (var u in lUsers.GetList().Where(x => x.selected)) 
    { 
     foreach (var screen in lScreen.GetList().Where(x => x.selected)) 
     { 
      if (ta.GetData() 
       .Any(x => x.fccompid == _fccompid 
        && x.fcmodid.Trim() == screen.fcmodid.Trim() 
        && x.fcuname.Trim() == u.fcuname.Trim())) 
       ta.Update(perm, screen.fcmodid, _fccompid, u.fcuname); 
      else 
       ta.Insert(screen.fcmodid, u.fcuname, _fccompid, perm, "P"); 
     } 
    } 
} 

를 통해 삽입/업데이트를 수행 할 수 있습니다.
여기

PROCEDURE M2MTrig_UTACCInsert 
LOCAL Cntr, ErrCode, ConStr, ConnName, ConnHandle, RV, ErrHndlr 
SET DATA TO UTIL 
ErrHndlr = ON("ERROR") 
IF EMPTY(UTACC.FCUNAME)AND EMPTY(UTACC.FCMODID)AND EMPTY(UTACC.FCCOMPID) THEN 
RETURN .T. 
ENDIF 
ErrCode = 0 
ON ERROR ErrCode = M2MTrig_ERR(ERROR(),MESSAGE(),ErrHndlr) 
FOR Cntr = 1 TO 99 
ConnName = "SystemDBConn" + ALLTRIM(STR(Cntr)) 
TRY 
ConStr = DBGETPROP(ConnName,"CONNECTION","ConnectString") 
CATCH TO oEx 
ErrCode = oEx.ErrorNo 
ENDTRY 
IF ErrCode = 1562 THEN 
EXIT 
ENDIF 
IF ErrCode <> 0 THEN 
ON ERROR &ErrHndlr. 
RETURN .F. 
ENDIF 
ConnHandle = SQLCONNECT(ConnName) 
IF ErrCode <> 0 THEN 
RETURN .F. 
ENDIF 
IF ConnHandle < 1 THEN 
M2MTrig_ERR(-1, "Unable to connect using " + ConnName, ErrHndlr) 
RETURN .F. 
ENDIF 
IF ErrCode <> 0 THEN 
SQLDISCONNECT(ConnHandle) 
RETURN .F. 
ENDIF 
Select UTACC 
RV = M2MTrig_ExecSQL("EXEC UpdUTACC " + XC(FCACCLVL)+ ", "+ XC(FCCOMPID)+ ", "+ XC(FCMODID)+ ", "+ XC(FCSCOPE)+ ", "+ XC(FCUNAME), .T., ConnHandle, ErrHndlr) 
IF ErrCode <> 0 THEN 
SQLDISCONNECT(ConnHandle) 
RETURN .F. 
ENDIF 
SQLDISCONNECT(ConnHandle) 
IF ErrCode <> 0 THEN 
RETURN .F. 
ENDIF 
IF RV < 0 THEN 
RETURN .F. 
ENDIF 
IF RV < 1 THEN 
M2MTrig_ERR(-1, "Could not update System database", ErrHndlr) 
RETURN .F. 
ENDIF 
NEXT Cntr 
ON ERROR &ErrHndlr. 
RETURN .T. 

답변

0

OLEDB 공급자의 폭스 엔진은 폭스의 부분 집합 명령과 기능 만 지원하는 FoxPro에 트리거입니다. MSDN에는 supported language elements hereunsupported ones here의 목록이 있습니다.

원격 SQL 함수 SQLCONNECT() 등은 금지 된 항목 목록에 있습니다. 오류 처리기는 MessageBox(), WAIT WINDOW, SET MESSAGE 또는?와 같은 금지 된 항목을 사용할 수도 있습니다.

코드 외에도 많은 문제가있는 것으로 보입니다. m로 메모리 변수에 대한 rvalue 액세스 자격을 부여하는 것과 같이 안전하고 깨끗한 코딩을위한 모든 지침을 무시한다는 사실부터 시작합니다. 또는 m-> 새 테이블에서 필드 이름을 사용하는 불쾌한 일이나 트리거 코드에서 수행 할 작업과 관련된 규칙을 피하십시오.

코드를 완전히 스크랩하고 더 간단하고 깨끗한 솔루션을 찾아보십시오.

P.S. : 기존 인프라를 사용하는 한 가지 방법은 OLEDB를 통하지 않고 COM을 통해 Fox 측을 제어하는 ​​것입니다. 즉 COM을 통해 즉, 작은 COM 서버 exe를 구축하는 것입니다. DoCmd()를 통해 Fox에 명령을 보내는 것만 큼 간단 할 수도 있고, 완전한 COM 객체처럼 복잡 할 수도 있습니다. VFP9에서는 배열과 행 집합을 COM 메서드에서 반환 할 수도 있으므로 인터페이스는 원하는대로 풍부해질 수 있습니다.

P.P.S : 데이터가 SQL Server 데이터베이스에있는 경우 왜 Fox와 이야기하고 있습니까?

+0

문제가있는 FoxPro에 대해 이야기하고 있습니다. 두 번째 옵션은 CRUD를 수행 할 FoxPro COM 개체를 만드는 것입니다. COM 개체에 동일한 문제가 있는지 알고 계십니까? – midohioboarder

+0

그리고 도와 주셔서 감사합니다. 정말 감사합니다. – midohioboarder

+0

이전 ERP 시스템은 FoxPro를 기반으로 구축되었습니다. 시스템이 SQL Server로 천천히 마이그레이션되고 있습니다. 나는 제 3 자로 볼트 온 앱을 만들고 있습니다. 그러면 COM 객체의 길로 내려갈 것입니다. 다시 한번 감사드립니다. – midohioboarder