3

CommandTextプロパティがSQLクエリに設定されているTDataSetを使用しています。また、TDataSetのフィールドに基づいてSQLクエリの一部を作成する次の関数を作成しました。しかし、それは不完全です。ご覧のとおり、TFieldの元のテーブルの名前を取得する必要があります。どうすればこれを達成できますか?

function GetDataSetFieldsMSSQL(Dataset: TDataSet): String;
var
  I, L: Integer;
  TableName: String;
begin
  Result := '';
  L := Dataset.Fields.Count;
  if (L > 0) then
  begin
    TableName := ... // Name of the table for the Dataset.Fields[0] field.
    Result := '[' + TableName + '].[' + Dataset.Fields[0].FieldName + ']';
    I := 1;
    while (I < L) do
    begin
      TableName := ... // Name of the table for the Dataset.Fields[I] field.
      Result := Result + ',[' + TableName + '].[' + Dataset.Fields[I].FieldName + ']';
      Inc(I);
    end;
  end;
end;
4

4 に答える 4

3

GetTableNameFromQuery(SQL : String):String;ユニットからDelphi機能を使用できますDBCommonDBCommon用途に追加するだけです。=)

于 2014-04-07T19:41:41.270 に答える
2

たぶん、単純なTDataSetの解決策はまったくありませんか?

私は信じていません。TDatasetは、RDBMSテーブルからだけでなくそのデータを取得できるためです。かもね:

  1. RSSフィード
  2. XMLファイル。例:TCliendatasetは、独自の形式から、またはXMLTransformProviderを使用してXMLを読み取ることができるTDatasetの子孫です。
  3. そのためのODBCドライバーがあり、データソースを構成している場合は、Excelスプレッドシートまたはテキストファイルを読み取るためのSQLにすることができます。
  4. Sky(および世界中のDelphiのプログラマーの想像力)は、フィールドがTDatasetで表すことができるものの限界です。

ADODatasetを使用しているため、いくつかの選択肢があります。

  • ADOCommandのcommandTextの解析
  • ADORecordSetのBASETABLENAMEプロパティを使用する(kobikのコメントのように)
  • 慣例による推測(アベリストの答え
于 2012-06-19T21:12:27.820 に答える
1

私が知っているように、SQLクエリコンポーネントからテーブルの名前を取得する方法はありません。ただし、フィールドにエイリアスを指定することはできます。たとえば、「foo_fieldをfooからfoo_dot_foo_fieldとして選択」してから、正しい構文に置き換えます。「Result:='[' + StringReplace(DataSet.Fields [0] .FieldName、' dot」 、']。['、[rfReplaceAll])+']' "

于 2012-06-19T12:01:29.453 に答える
1

クエリで使用されるSQLについての知識や制御がない場合、実行しようとしていることは不可能です。クエリには、計算/計算されたフィールドが含まれる場合や、ビューなどからフィールドが返される場合があります。さらに、データベースには、同じフィールド名を含む複数のテーブルが含まれる場合があります。

可能であれば、SQLサーバービューINFORMATION_SCHEMA.COLUMNSにクエリを実行し、その方法でフィールド名がどのテーブルからのものであるかを把握してみてください。ただし、フィールド名が一意でない場合、これも不可能であることが判明する可能性があります。

于 2012-06-19T20:37:40.973 に答える