2012-07-05 2 views
0

MSSQL 저장 프로 시저에 연결된 데이터 모듈에 Tadocommand가 있습니다. storedproc는 테이블을 갱신하는 데 사용됩니다. 내 코드에서 Tclientdatasets 중 하나의 beforeupdaterecord 메서드에서 tadocommand를 호출합니다.Delphi Tadocommand 매개 변수를 재설정하는 방법

먼저 tclientdataset의 deltads.fieldbyname(). newvalue를 사용하여 tadocommand 매개 변수에 값을 제공 한 다음 execute 프로 시저를 호출합니다. 그것은 첫 번째 업데이 트에 대한 확인을 작동하지만 만약 내가 다음 번에 "datetime에 varchar를 변경하는 오류"를 생성 업데이 트를하려고합니다.

내가 동적으로 오류없이 작동

sp1_editcontract:=Tadocommand.Create(nil); 
sp1_editcontract.CommandType:=cmdStoredProc; 
sp1_editcontract.Connection:=DMDBconn.DBConn; 
sp1_editcontract.CommandText:='EditContract'; 
sp1_editcontract.Parameters.Refresh; 
//assign parameter values 
sp1_editcontract.execute; 
sp1_editcontract.free; 

즉 BeforeUpdateRecord는 방법에 tadocommand을 만드는 경우. 데이터 모듈에 정적 Tadocommand를 사용할 때 매개 변수 값에 문제가 있다고 생각합니다.

동적으로 생성 된 tadocommand가 아닌 정적으로 생성 된 tadocommand를 사용할 때 왜 다중 업데이트가 오류를 생성합니까?

+0

데이터 모듈에 동적으로 생성 된 tadocommand가 아닌 이유는 무엇입니까? – mem100

+1

질문이 업데이트되었습니다. – mem100

+0

호출간에 명령 (프로 시저 이름)을 변경하고 있습니까? – jachguate

답변

0

TDatasetProvider.BeforeUpdateRecord을 말하는 것으로 가정하고 TClientDataSet.BeforeUpdateRecord이 아닌 것으로 가정합니다.

제공 한 정보로 말하기가 다소 어렵습니다 (스토어드 프로 시저의 인수 또는 데이터 형식을 나타내지는 않음). 오류 메시지는 SQL Server 엔진에서 제공됩니다. 매개 변수에 할당 된 값이 항상 올바른 순서로 설정되어 있는지 확인합니다. 또한 어떤 매개 변수가 오류의 원인인지 확인하십시오. 클라이언트 코드에서 안정적으로 재현 할 수 있으면 클라이언트 응용 프로그램에서 오류를 일으키는 값과 동일한 값을 전달하는 SSMS에서 저장 프로 시저를 호출 해보십시오.

매개 변수를 식별하면 해당 데이터 형식이 ADOCommand, DatasetProvider 및 ClientDataSet간에 일관성이 있는지 확인할 수 있습니다. 오류의 원인이 될 수있는 방향으로 타입을 변경하는 경우.

마지막 제안 사항은 BeforeUpdateRecord 처리기를 종료하기 전에 TDatasetProvider.Applied := True으로 설정해야합니다. 이렇게하면 데이터 세트 공급자가 이미 업데이트를 적용한 후에 동적 SQL을 사용하여 업데이트를 적용하지 못하게됩니다. 클라이언트 데이터 집합의 데이터가 TADOQuery에 의해 채워진 경우 테이블을 직접 업데이트하려고 시도했을 수 있습니다.

0

비슷한 문제가있었습니다. 새에게 사용하는 다음 코드를 추가하기 전에 ADOCommand의 기존의 모든 매개 변수를 취소하기 위해 :

while Command.Parameters.Count>0 do 
    Command.Parameters.Delete(0); 

Parameters.Clear

는 일한해야하지만 않았나, 그래서 매개 변수 하나 하나를 제거하기로 결정했다. 그게 내게 고정 된거야.

관련 문제