質問

私はJava開発者です。私はデルフィに古いプログラムを持っています。古いバージョンでは、彼らは一緒に働いています mdb. 。 SQL Serverとの接続のために修正しました。すべてのSQLクエリが実装されます 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") ';

プログラムは例外をスローします:

無効な列名「DD/mm/yyyy」。

比較のために他のクエリを修正しました:

 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);

プロジェクト全体を書き換えることなく、SQL Serverでの作業のすべてのクエリをすばやく修正できますか?

役に立ちましたか?

解決

仮定します PayDate と定義されている date/datetime MSSQLでは、次のようにパラメーターを使用できます。

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;

私も変わります cashNum パラメーターへのIEへ:

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

文字列をフォーマットして使用するよりも、常にパラメーターを使用して互換性のあるデータ型を使用することを好みます。 SQLは、データ型を明示的に定義できれば推測する必要はありません。

ノート: IIF SQL Server 2012で導入されました。 場合 表現。


古い非ユニコードDelphiバージョンでは、パラメーターがUnicodeに問題があります。
だから、もしあなたの場合 しないでください パラメーターを使用すると、次のものを使用できます。

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;

そして、あなたのクエリは次のように見えます:

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

他のヒント

その可能性が非常に高い PayDate 列はとして宣言されています DATE の中に cash テーブル。それを考慮して、パラメーターはaにする必要があります TDateTime そして、ではありません string, 、 このような:

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;

パラメーターの1つのみを交換しましたが、それらすべてを交換することを検討する必要があります。これにより、文のキャッシュを有効にすることでサーバーのパフォーマンスが向上するためです。

元の質問に戻ると、すべてのアプリケーションをリファクタリングする唯一の方法は、コードを解析し、それらの状況を見つけ、パターンに従ってあるコードを別のコードに置き換えることができるリファクタリングプログラムを持つことだと思います。

私は今日それを行うことができるツールを知りません。

たぶん、正規表現をサポートする検索/交換を使用すると、1つのパスでケースを修正することはできません。コードからそれが何であるかに変換するために、一連の交換フェーズを実行する必要があります。

DateToStrは、グローバル変数に含まれるローカリゼーション情報を使用して、日付文字列をフォーマットします。たぶんこれが問題です。

formatdatimeを試すことができます:

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)+'''';
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top