Domanda

Sono uno sviluppatore Java. Ho un vecchio programma a Delphi. Nella vecchia versione con cui lavorano mdb. L'ho risolto per la connessione con SQL Server. Tutte le query SQL sono implementate TAdoQuery.

qryTemp.SQL.Text:='select  sum(iif(ComeSumm>0,comesumm,0)),sum(iif(lostSumm>0,lostsumm,0)) from cash '+
   'where (IdCashClause is null or idcashclause<>8) '+
  ' and cashNum='+IntToStr(i)+
  ' and CashType=0'+
  ' and format(PayDate,"dd/mm/yyyy")=format('''+DateToStr(Date)+''',"dd/mm/yyyy") ';

Il programma genera un'eccezione:

Nome colonna non valido 'dd/mm/yyyy'.

Ho risolto altre domande per il confronto:

 qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
                     +' where idCashReason=1 and idCashClause=8 and cashNum='+IntToStr(i)
                     +' and PayDate<:D'
                     +' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value:=DateTimeToStr(Date);

Posso correggere rapidamente tutte le query per lavoro con SQL Server senza riscrivere l'intero progetto?

È stato utile?

Soluzione

Supponendo PayDate è definito come date/datetime In MSSQL è possibile utilizzare i parametri come segue:

qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
                     +' where idCashReason=1 and idCashClause=8 and cashNum='+IntToStr(i)
                     +' and PayDate<:D'
                     +' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value := Date;
qryTemp.Parameters.ParamByName('D').DataType := ftDateTime;

Cambierei anche cashNum al parametro cioè:

...
+' where idCashReason=1 and idCashClause=8 and cashNum=:cashNum'+
...
qryTemp.Parameters.ParamByName('cashNum').Value := i;

Preferisci sempre utilizzare tipi di dati compatibili con i parametri, piuttosto che la formattazione e l'uso di stringhe. SQL non è necessario indovinare i tipi di dati se puoi definirli esplicitamente.

Nota: IIF è stato introdotto in SQL Server 2012. Per l'uso della versione precedente ASTUCCIO espressione.


Nelle versioni più vecchie non UNICODE Delphi, i parametri hanno problemi con Unicode.
Quindi, se tu non Usa i parametri che potresti usare quanto segue:

function DateTimeToSqlDateTime(const DT: TDateTime): WideString;
begin
  Result := FormatDateTime('yyyy-MM-dd', DT) + ' ' + FormatDateTime('hh:mm:ss', DT);
end;

function SqlDateTimeStr(const DT: TDateTime; const Is_MSSQL: Boolean): WideString;
var
  S: WideString;
begin
  S := DateTimeToSqlDateTime(DT);
  if Is_MSSQL then
    Result := Format('CONVERT(DATETIME, ''%s'', 102)', [S]) 
  else
    Result := Format('#%s#', [S]); // MS-ACCESS
end;

E la tua domanda sembrerà seguita:

...
+' and PayDate<' + SqlDateTimeStr(Date, True)
...

Altri suggerimenti

È molto probabile che il PayDate la colonna è dichiarata come DATE nel cash tavolo. Considerando questo, il tuo parametro dovrebbe essere un TDateTime e non a string, come questo:

qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
                     +' where idCashReason=:cashReason and idCashClause=8 and cashNum='+IntToStr(i)
                     +' and PayDate<:D'
                     +' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value := Date;

Ho sostituito solo uno dei parametri, ma dovresti prendere in considerazione la sostituzione di tutti, poiché ciò migliorerà le prestazioni del server abilitando la sua cache delle frasi.

Tornando alla tua domanda originale, immagino che l'unico modo per rifactare tutta l'applicazione sarebbe quella di avere un programma di refactoring che potrebbe analizzare il tuo codice, trovare quelle situazioni e seguire un modello per sostituire un pezzo di codice da un altro.

Non conosco alcun strumento che possa farlo Nothyways.

Forse usare Find/Sostituisci che supporta espressioni regolari può aiutarti, ma certamente non risolverà i casi in un unico passaggio. Dovresti eseguire una serie di fasi di sostituzione per trasformare il tuo codice da ciò che è a quello che vuoi che sia.

DateToStr utilizza le informazioni di localizzazione contenute nelle variabili globali per formattare la stringa di data. Forse questo è il problema.

Puoi provare FormatDateTime:

qryTemp.SQL.Text:='select  sum(iif(ComeSumm>0,comesumm,0)),sum(iif(lostSumm>0,lostsumm,0)) from cash '+
   'where (IdCashClause is null or idcashclause<>8) '+
  ' and cashNum='+IntToStr(i)+
  ' and CashType=0'+
  ' and format(PayDate,"dd/MM/yyyy")='''+FormatDateTime('dd/mm/yyyy',Date)+'''';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top