2012-12-13 2 views
4

저는 SQL Server를 사용하여 델파이 7의 테이블에서 일부 필드를 업데이트하는 프로그램을 개발하고 있습니다. 프로그램은 다음과 같이 진행됩니다쿼리는 SQL Server 관리 스튜디오 2008에서 작동하지만 델파이에서는 작동하지 않습니다

sql := 'UPDATE tb_dt_contract SET ' 
     +' id_schedule = '+quotedstr(label_id_schedule.Caption) 
     +',start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date)) 
     +',finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date)) 
     +',contract_location = '+quotedstr(uppercase(Edit_location.Text)) 
     +',sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date)) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

내가 프로그램을 실행할 때, 그것은 나에게 오류를 제공합니다 : '근처의 구문이 잘못되었습니다'= ''를. 하지만 showmessage를 사용하여 쿼리를보고 SQL Server 2008에서 실행하면 정상적으로 작동합니다.

는이 같은 부분으로 쿼리를 분할하려고 :

SQL := 'UPDATE tb_dt_contract SET ' 
     +' id_schedule = '+QUOTEDSTR(label_id_schedule.CAPTION) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

SQL := 'UPDATE tb_dt_contract SET ' 
     +' start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date)) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

SQL := 'UPDATE tb_dt_contract SET ' 
     +' finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date)) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

SQL := 'UPDATE tb_dt_contract SET ' 
     +' contract_location = '+quotedstr(uppercase(edit_location.Text)) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

SQL := 'UPDATE tb_dt_contract SET ' 
     +' sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date)) 
     +' WHERE id = '+quotedstr(label_id.Caption); 
ADOQuery1.Close; 
ADOQuery1.SQL.Text := sql; 
ADOQuery1.ExecSQL; 

다음 내가 날짜 유형 필드를 업데이트 할 때 그것은 단지 오류를 트리거 것을 알아 냈다. 비슷한 쿼리를 사용하여 다른 테이블을 업데이트하는 다른 프로그램을 개발하고 잘 작동합니다. 프로젝트를 닫고 다시 시도했지만 여전히 그 오류 메시지를 제공합니다.

+1

확실히 'mm/dd/yyyy'는 신뢰할 수있는 형식이 아닙니다 (월과 일을 바꿀 수 있음). 'yyyymmdd'를 미래가 – ErikE

+0

오? SQL 서버에서 날짜 형식을 편집 할 수 있습니까? datetime에 대해 SQL 서버에서 사용 된 형식이라고 생각하여 mm/dd/yyyy를 사용 했습니까? – dapidmini

+0

아니요. 유효한 가정이 아닙니다. – ErikE

답변

14

변환을 피하고 데이터베이스에 독립적 인 저장 쿼리를 작성하려면 매개 변수를 사용해야하며, 두 번 이상 사용하면 조작 속도가 빨라질 수 있습니다.

Adoquery1.SQL.Text := 'UPDATE tb_dt_contract SET finish_date=:df where WHERE id =:id'; 
    // in some cases it may be necessary to add the three comented lines 
    //Adoquery1.Parameters.ParseSQL(Adoquery1.SQL.Text,true); 
    //Adoquery1.Parameters.ParamByName('df').DataType := ftDateTime; 
    //Adoquery1.Parameters.ParamByName('id').DataType := ftInteger; 
    Adoquery1.Parameters.ParamByName('df').Value :=DateTime_finish.Date; 
    Adoquery1.Parameters.ParamByName('ID').Value :=StrToInt(label_id.Caption); 
    Adoquery1.ExecSQL; 
+2

+1 매개 변수 사용을 촉진하기 위해! – ComputerSaysNo

+1

Bummi, 아마도 Adoquery.ParamCheck가 SQL 텍스트 – whosrdaddy

+0

@whosrdaddy를 설정하기 전에 True로 설정되어야한다는 사실을 추가하십시오. 덕분에 실제로 더 편안하게 만들 수 있습니다. Adoquery.ParamCheck 기본값이 true 인 경우 Adoquery.ParamCheck : = false와 함께 사용하고 직접 수행 할 수 있습니다. Adoquery1.Parameters.ParseSQL (Adoquery1.SQL.Text, true); Adoquery1.Parameters.ParamByName ('df'). 데이터 형식 : = ftDateTime; ...... – bummi

-1

나는 그것을 알아 냈다! (더 비슷한, 내 동료 않았다)

분명히 FormatDateTime ('mm/dd/yyyy'를 datetostr로 바꾸고 shortdateformat을 'mm/dd/yyyy'로 설정하면 쿼리가 정상적으로 작동합니다. 왜 그런지 궁금합니다. 하지만, 그 명령이 똑같은 것 같아요?

+1

이렇게하지 마십시오. 그들이 Bummi가 말하는 방식대로해라. –

+0

차이점은 DateDelimiter를 설정하지 않은 것일 수 있습니다. ShortdateFormat 만 해당합니다. –

+0

이는 Formatsettings가없는 DateToStr이 지역화 된 컴퓨터 설정을 사용하고 데이터베이스가 형식을 좋게 만들거나별로 좋아하지 않을 수 있기 때문입니다. FormatDateTime ('yyyymmdd')을 사용하면 모호함을 없앨 수 있습니다. 2003 년 1 월 2 일이지만 2003 년 2 월 1 일이지만 다른 일부에서는 2001 년 2 월 1 일에 februari 3을 의미하는 일부 사람들에게 01/02/03을 고려하십시오. YYYYMMDD는 보편적입니다 .20030201은 항상 februari 2003의 1 위입니다. –

관련 문제