PostgresDB更新時のエラーを解決するには?

解決


ない  2011-03-26 23:30:50  No: 40326

Delphi7-PostgresSQL(PgOleDb.dll)で
更新SQL実行時に、
[EOleException] 行セットで列が定義されていません。
というエラーが出ますが
何がおかしいのか分かりません。
そのあと、Commitすると正常に更新されているし、
Rollbackすると更新されていないし・・・。
何かヒントになるようなことでもよろしいので
エラー解決の情報をお願いします。


HOta  2011-03-26 23:49:22  No: 40327

更新するテーブルのField名と更新SQLのField名が合っていないのでしょう。


ない  2011-03-29 01:07:17  No: 40328

HOta様
  返信ありがとうございます。
  しかし、ツール上で直接そのSQLを発行すると
  OKなんで・・・。

一応、ソースのっけておきます。
なんか手がかりがあればいいのですが・・・。

開発環境
  Windows2000 Delphi7 PostgresSQL8.4.2
「PgOleDb.dll」を利用

画面にButton1つとEditを2つです。

uses
  ADODB, ComObjを追加

procedure TForm1.Button1Click(Sender: TObject);
var
  DBDataPassword: String;
  DBDataUserID: String;
  DBDataSource: String;
  DBDataLocation: String;
  DBExtendedProperties: String;
  str_ErMes: String;
  str_Result: String;
  AdoQuery1: TADOQuery;
  AdoConnection1:TAdoConnection;
begin
  str_Result := '';
  str_ErMes := '';
  AdoConnection1 := TADOConnection.Create(nil);
  AdoQuery1 := TADOQuery.Create(nil);

  DBDataPassword := 'Password';//パスワード
  DBDataUserID := 'UserID';//ユーザーID
  DBDataSource := 'Source';//データソース
  DBDataLocation := 'Location';
  DBExtendedProperties := '""';//フラグ
  try
    try
      AdoConnection1.Connected := False;
      AdoConnection1.Provider := 'PostgreSQL.1';
      AdoConnection1.ConnectionString := AdoConnection1.ConnectionString + 'Password=' + DBDataPassword + ';';
      AdoConnection1.ConnectionString := AdoConnection1.ConnectionString + 'User ID=' + DBDataUserID + ';';
      AdoConnection1.ConnectionString := AdoConnection1.ConnectionString + 'Data Source=' + DBDataSource + ';';
      AdoConnection1.ConnectionString := AdoConnection1.ConnectionString + 'Location=' + DBDataLocation + ';';
      AdoConnection1.ConnectionString := AdoConnection1.ConnectionString + 'Extended Properties=' + DBExtendedProperties + ';';
      AdoConnection1.LoginPrompt := False;
      AdoConnection1.ConnectionTimeout := 5;
      AdoConnection1.Connected := True;

      AdoQuery1.Connection := AdoConnection1;
      AdoQuery1.Close;
      AdoQuery1.SQL.Clear;
      AdoQuery1.SQL.Add('UPDATE [TABLE] SET [FIELD] = ''[Edit1のDATA]''');
      AdoQuery1.SQL.Add('WHERE [KEY_FIELD1] = ''[KEY_DATA1]''');
      AdoQuery1.SQL.Add('AND [KEY_FIELD2] = ''[KEY_DATA2]''');
      AdoQuery1.SQL.Add('AND [KEY_FIELD3] = ''[Edit2のDATA]''');
      AdoQuery1.ExecSQL;       <----------------- ここでエラー発生!
    except
      on EO: EOleException do begin
        str_ErMes := '[' + EO.ClassName + '] ' + EO.Message;
      end;
      on E: Exception do begin
        str_ErMes := '[' + E.ClassName + '] ' + E.Message;
      end;
    end;
  finally
    AdoQuery1.Free;
    AdoConnection1.Free;
  end;

  if (str_ErMes = '') then begin
  end else begin
    ShowMessage(str_ErMes);
  end;
end;


HOta  2011-03-29 02:34:24  No: 40329

SQL文をテキストに落として、後でツール上で直接そのSQLを発行してみるとどうでしょうか。
>  AdoQuery1.SQL.Add('AND [KEY_FIELD3] = ''[Edit2のDATA]''');
   AdoQuery1.SQL.SaveToFile('hogehoge.sql') //でテキストに落とす。
>  AdoQuery1.ExecSQL;       <----------------- ここでエラー発生!


nobukoshi802  2011-03-30 07:55:14  No: 40330

SQLの更新値に、’(シングルコーテーション)が入っているとか?


ない  2011-04-07 00:32:12  No: 40331

いろいろ調べたところ、
.CursorLocation := clUseServer;
が抜けていました。

皆様、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加