![]() |
Datenbank: MySQL • Version: 4.1 • Zugriff über: dBExpress
TDBXTypes.WideString-Wertetyp
Hallo alle zusammen.
Habe ein Programm das auf einen MySQL Datenbank auf einem HP Server zugreifen soll (Werte lesen und ändern). Dank diesem Forum konnte ich nun einen Verbindung mit dem Server herstellen. (Nach einer Installation eines älteren Connectors (libmysql.dll +php_mysql) Nun ist es aber leider so, dass ich teils Informationen aus der Datenbank abrufen kann doch bei den meisten kommt eine Fehlemeldung und bricht ab: Auf TDBXTypes.ZSTRING-Wertetyp kann nicht als TDBXTypes.WideString-Wertetyp zugegriffen werden. So sieht der Code aus der es verursacht:
Delphi-Quellcode:
var
FieldNamesList: TStringList; SQLStmt: String; I: Integer; begin // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren. CheckBoxActive.Enabled := True; ButtonApply.Enabled := True; TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen // Feldnamen (Spaltennamen) für diese Tabelle abrufen. FieldNamesList := TStringList.Create; FieldNamesList.Clear; SQLConnection1.GetFieldNames(TableName, FieldNamesList); // Select-SQL-Anweisung für alle Felder erstellen. if FieldNamesList.Count > 0 then begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do begin SQLStmt := SQLStmt + FieldNamesList[I] + ','; end; SQLStmt[Length(SQLStmt)] := ' '; SQLStmt := SQLStmt + 'from '+TableName; end else // Feldnamen nicht gefunden, daher '*' verwenden SQLStmt := 'select * from '+TableName; FreeAndNil(FieldNamesList); // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen. EditSQL.Text := SQLStmt; // CommandText auf SQL-Anweisung setzen. SQLDataSet1.CommandText := EditSQL.Text; if ClientDataSet1.Active then ClientDataSet1.Close; ClientDataSet1.Open; CheckBoxActive.Checked := True; end; Ich habe diesen Code von folgendem Toutorial. Da ich noch ein ziemmlicher Anfänger bin :-) ![]() Wer kann mir helfen? |
AW: TDBXTypes.WideString-Wertetyp
Welche Delphi-Version?
Könnte mir vorstellen das die dbExpress-Version nicht mit der libmysql-DLL zusammenspielt. Am wenigsten Probleme hat man mit den TDataset-Nachfahren von DevArt. Kosten zwar ein paar €, verhindern aber das man zu schnell graue Haare bekommt oder sie sich ausreißt :-) |
AW: TDBXTypes.WideString-Wertetyp
Hallo Danke für die schnelle Antwort.
Ich habe Delphi 2009 Prof. 12.0.3170.16989 Graue Haare will ich zwar nicht aber vielleicht gibt es doch eine Lösung ohne weitere Komponenten oder so? ;-) |
AW: TDBXTypes.WideString-Wertetyp
Grüezi mitenand,
Delphi-Quellcode:
Gruß
if FieldNamesList.Count > 0 then
begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do begin SQLStmt := SQLStmt + FieldNamesList[I] + ','; // Kann es hier sein, dass Dein SQL-Statement select Name1, Name2, ... NameN, <- Komma beachten generiert end; SQLStmt[Length(SQLStmt)] := ' '; SQLStmt := SQLStmt + 'from '+TableName; // und hier // select [..], <- Komma beachten from TableName und es scheppert? end |
AW: TDBXTypes.WideString-Wertetyp
Ja hoi
Auch noch da? :-) Hmm das kann natürlich sein. Aber ehrlich gesagt falls dies so wäre, wie müsste man es richtig machen?:oops: |
AW: TDBXTypes.WideString-Wertetyp
Ja noch da,
Zitat:
Delphi-Quellcode:
Gruß
var
s : string; begin if FieldNamesList.Count > 0 then begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do if s = '' then s := FieldNamesList[I] else s := s + ',' + FieldNamesList[I]; SQLStmt := SQLStmt + [B]s[/B] + ' from '+TableName; end end |
AW: TDBXTypes.WideString-Wertetyp
Hmm jetzt hab ich leider folgende Meldung:
You have an error in your SQL syntax; check the Manual that corresponds to your MySQL Server Version for the right Syntax to use near from product_related' at line 1. :?: |
AW: TDBXTypes.WideString-Wertetyp
Oh ich merke gerade das die alte Meldung in den meisten Fällen auch noch kommt. Je nach Eintrag in der Datenbank kommt die eine oder andere Meldung
|
AW: TDBXTypes.WideString-Wertetyp
Hallo,
kannst Du mal das SQL postend Gruß |
AW: TDBXTypes.WideString-Wertetyp
Wie meinst du das? (SQL Posten)? :oops:peinlich:oops:
|
AW: TDBXTypes.WideString-Wertetyp
Hallo,
wenn du einen Breakpoint bei
Delphi-Quellcode:
setzt und dann den "Inhhalt" der Variable SQLStmt postest (an den Wert kommst Du in den lokalen Variablen SQLStmt markieren, rechte Maustaste, Untesuchen).
SQLStmt := SQLStmt + s + ' from '+TableName;
Gruß |
AW: TDBXTypes.WideString-Wertetyp
Hallo
Habe nicht gesehen dass es schon eine zweite seite gibt. Ok ich glaube ich habe das gemacht was du geschrieben hast ;-) Es steht: SQLsTmt: string $18F418 : $58E54C SQLStmt 'select' Gruess |
AW: TDBXTypes.WideString-Wertetyp
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
sorry es ist wohl doch schon etwas spät. Ich meinte eigentlich den Wert, der neben SQLStmt steht (siehe Screenshot) Gruß |
AW: TDBXTypes.WideString-Wertetyp
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ach und danke für deine Geduld ;-) Anhang 38339 |
AW: TDBXTypes.WideString-Wertetyp
Hallo,
am Screenshot kann ich sehen, dass zwar s auf category_id bzw. SQLStmt auf select steht. Soweit sieht alles ganz gut aus. Was ich leider nicht sehen kann ist der else Zweig. Gruß |
AW: TDBXTypes.WideString-Wertetyp
Liste der Anhänge anzeigen (Anzahl: 1)
So müsste es besser sein
Delphi-Quellcode:
// Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
CheckBoxActive.Enabled := True; ButtonApply.Enabled := True; TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen // Feldnamen (Spaltennamen) für diese Tabelle abrufen. FieldNamesList := TStringList.Create; FieldNamesList.Clear; SQLConnection1.GetFieldNames(TableName, FieldNamesList); if FieldNamesList.Count > 0 then begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do if s = '' then s := FieldNamesList[I] else s := s + ',' + FieldNamesList[I]; SQLStmt := SQLStmt + s + ' from '+TableName; end else // Feldnamen nicht gefunden, daher '*' verwenden SQLStmt := 'select * from '+TableName; FreeAndNil(FieldNamesList); // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen. EditSQL.Text := SQLStmt; // CommandText auf SQL-Anweisung setzen. SQLDataSet1.CommandText := EditSQL.Text; if ClientDataSet1.Active then ClientDataSet1.Close; ClientDataSet1.Open; CheckBoxActive.Checked := True; end; |
AW: TDBXTypes.WideString-Wertetyp
Hallo,
ist ist wohl definitiv zu spät für mich :) Setzte den Braikpoint doch mal
Delphi-Quellcode:
und poste dann den Wert von SQLStmt
if FieldNamesList.Count > 0 then
begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do if s = '' then s := FieldNamesList[I] else s := s + ',' + FieldNamesList[I]; SQLStmt := SQLStmt + s + ' from '+TableName; //-> genua hier end Gruß |
AW: TDBXTypes.WideString-Wertetyp
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm merkwürdig. er hält nicht an. dafür kann ich nun wesentlich mehr einträge abrufen ohne Fehlermeldung. bei ein paar einträgen kommt aber immer noch .
|
AW: TDBXTypes.WideString-Wertetyp
Aber jetzt crasht das Programm manchmal (Freeze)
Du ich muss mal schlafen gehen. Ich mach dann morgen weiter. Keine Ahnung was jetzt los ist und das Programm einfriert, manchmal schon beim Verbinden. Danke dir. |
AW: TDBXTypes.WideString-Wertetyp
Hallo,
Delphi-Quellcode:
Was für ein Wert steht dann in SQLstmt?
if FieldNamesList.Count > 0 then
begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do if s = '' then s := FieldNamesList[I] else s := s + ',' + FieldNamesList[I]; SQLStmt := SQLStmt + s + ' from '+TableName; end // <- also du setzt hier an dieser Stelle Deinen Breakpoint Gruß |
AW: TDBXTypes.WideString-Wertetyp
Es friert eben leider das Programm ein bevor ich zu der funtion komme,
|
AW: TDBXTypes.WideString-Wertetyp
Merkwürdig jetzts gings wieder als wäre nichts gewesen. jedoch hält er beim brekpoint nicht an....?
|
AW: TDBXTypes.WideString-Wertetyp
Hallo gee21,
poste doch mal Deine kompletten Sourcen, ich kuck dann morgen (morgen ist ja schon heute) mal drüber. Vielleicht finde ich ja dann den bösen Buben, der da querschießt. Gruß |
AW: TDBXTypes.WideString-Wertetyp
Hallo Volker
Das ist ja mega lieb. DAnke dir vielmals. Ich glaube das müsste von dieser form alles sein.
Delphi-Quellcode:
Unit Unit6;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, WideStrings, DBXMySql, SqlExpr, FMTBcd, DBClient, Provider, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls,DBXDataExpressMetaDataProvider,iniFiles, strUtils,cdsfield, DBXTrace; type Tform6 = class(TForm) SQLConnection1: TSQLConnection; ComboBoxConnections: TComboBox; Label1: TLabel; EditSQL: TEdit; EditFilter: TEdit; CheckBoxActive: TCheckBox; DBNavigator1: TDBNavigator; ButtonApply: TButton; listbox1: TListBox; DBGrid1: TDBGrid; SQLDataSet1: TSQLDataSet; DataSetProvider1: TDataSetProvider; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; procedure FormCreate(Sender: TObject); procedure ComboBoxConnectionsCloseUp(Sender: TObject); procedure listbox1DblClick(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure CheckBoxActiveClick(Sender: TObject); procedure ClientDataSet1BeforeClose(DataSet: TDataSet); procedure ButtonApplyClick(Sender: TObject); procedure EditFilterChange(Sender: TObject); procedure EditFilterEnter(Sender: TObject); procedure EditFilterExit(Sender: TObject); procedure EditSQLChange(Sender: TObject); procedure FormDestroy(Sender: TObject); private TableName: String; AllTables: TStringList; //Liste der Datenbanktabellen FMetaDataProvider: TDBXDataExpressMetaDataProvider; MemoForm: TFormCurrentField; public function MatchFilter(FilterStr, TestStr: String): Boolean; procedure PopulateListBox; end; const sDefaultFilterText = 'Filter (* as wild)'; var form6: Tform6; implementation {$R *.dfm} procedure Tform6.PopulateListBox; // AllTables muss auf die Liste der Tabellen für die aktive Datenbankverbindung gesetzt werden. var I: Integer; begin ListBox1.Items.Clear; for I := 0 to AllTables.Count - 1 do begin // Wenn kein Filter vorhanden ist oder die Tabelle dem Filter entspricht, Tabelle dem Listenfeld hinzufügen. if (EditFilter.Text = sDefaultFilterText) or MatchFilter(EditFilter.Text, AllTables[I]) then ListBox1.Items.Add(FMetaDataProvider.QuoteIdentifierIfNeeded(AllTables[I])); end; // Wenn das Listenfeld Einträge enthält, soll es aktiviert werden. if ListBox1.Count > 0 then ListBox1.Enabled := True; end; function Tform6.MatchFilter(FilterStr, TestStr: String): Boolean; var Pattern, EndPattern, TempStr: String; WildPos: Integer; begin Result := True; if FilterStr = '' then Exit; // Whitespace entfernen und in Großbuchstaben umwandeln. Pattern := UpperCase(Trim(FilterStr)); EndPattern := ''; //nichts bis gefunden // Auf Platzhalter überprüfen WildPos := AnsiPos('*', Pattern); if WildPos <> 0 then begin if WildPos < Length(Pattern) then //letztes Zeichen EndPattern := Copy(Pattern, WildPos+1, MaxInt); //beliebiger Text nach Platzhalter Pattern := Copy(Pattern, 1, WildPos-1); end; if (Pattern <> '') and (AnsiPos(Pattern, UpperCase(TestStr)) <> 1) then Result := False else if EndPattern <> '' then begin TempStr := AnsiRightStr(TestStr, Length(EndPattern)); if AnsiPos(EndPattern, UpperCase(TempStr)) <> 1 then Result := False; end; end; procedure Tform6.ButtonApplyClick(Sender: TObject); var X, Y: Integer; begin // Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt. ClientDataSet1.ApplyUpdates(-1); Y := Self.Top + Self.ButtonApply.Top; X := Self.Left + Self.ButtonApply.Left; // Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen. if MessageDlgPos('Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes then begin ClientDataSet1.Close; ClientDataSet1.Open; end; end; procedure Tform6.CheckBoxActiveClick(Sender: TObject); begin ClientDataSet1.Active := CheckBoxActive.Checked end; procedure Tform6.ClientDataSet1BeforeClose(DataSet: TDataSet); begin // Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben. if Assigned(MemoForm) then begin MemoForm.DBMemoCurrentField.DataField := ''; if MemoForm.Visible then MemoForm.Close; end; end; procedure Tform6.ComboBoxConnectionsCloseUp(Sender: TObject); begin // Wurde eine Auswahl getroffen? if ComboBoxConnections.ItemIndex = -1 then Exit; // Hilfsobjekte initialisieren. if not Assigned(AllTables) then AllTables := TStringList.Create; if Assigned(FMetaDataProvider) then FreeAndNil(FMetaDataProvider); // Falls eine geöffnete Verbindung vorhanden ist, soll sie geschlossen werden. Anzeigen, dass die Verbindung nicht aktiv ist. if SQLConnection1.Connected then SQLConnection1.Close; CheckBoxActive.Checked := False; // Die ausgewählte Datenbankverbindung öffnen. SQLConnection1.ConnectionName := ComboBoxConnections.Items[ComboBoxConnections.ItemIndex]; SQLConnection1.LoadParamsOnConnect := True; SQLConnection1.LoginPrompt := False; SQLConnection1.Open; SQLConnection1.GetTableNames(AllTables, False); //Liste der Tabellen aus der Datenbank abrufen // Metadaten für die ausgewählte Verbindung ermitteln. FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create; FMetaDataProvider.Connection := sqlconnection1.DBXConnection; //auf die geöffnete Verbindung setzen FMetaDataProvider.Open; // Das Listenfeld mit den Tabellen dieser Datenbankverbindung füllen. PopulateListBox; // Status einiger Dialogfeldelemente initialisieren. SQLDataSet1.CommandText := ''; EditSQL.Text := ''; CheckBoxActive.Enabled := False; ButtonApply.Enabled := False; end; procedure Tform6.EditFilterChange(Sender: TObject); begin if SQLConnection1.Connected then PopulateListBox; //Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen end; procedure Tform6.EditFilterEnter(Sender: TObject); begin EditFilter.Text := ''; end; procedure Tform6.EditFilterExit(Sender: TObject); begin if EditFilter.Text = '' then EditFilter.Text := 'Filter (* as wild)'; end; procedure Tform6.EditSQLChange(Sender: TObject); begin SQLDataSet1.CommandText := EditSQL.Text; end; procedure Tform6.FormDestroy(Sender: TObject); begin // Die Verbindung schließen. if SQLConnection1.Connected then SQLConnection1.Close; // Objekte freigeben. if Assigned(FMetaDataProvider) then FreeAndNil(FMetaDataProvider); if Assigned(MemoForm) then FreeAndNil(MemoForm); if Assigned(AllTables) then FreeAndNil(AllTables); end; procedure Tform6.DBGrid1CellClick(Column: TColumn); begin if ClientDataSet1.Active then begin // Wenn das Formular nicht angezeigt wird, wird es erstellt. if not Assigned(MemoForm) then begin MemoForm := TFormCurrentField.Create(Self); MemoForm.DBMemoCurrentField.DataSource := DataSource1; //Datenquelle festlegen end; // Formular genau unterhalb des Hauptdialogfeldes positionieren. MemoForm.Top := Self.Top+Self.Height; MemoForm.Left := Self.Left; MemoForm.Visible := False; MemoForm.Visible := True; MemoForm.DBMemoCurrentField.DataField := Column.FieldName; // Im Titel Informationen über das Feld anzeigen MemoForm.Caption := Format('Field Name: %s / Record Num: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]); MemoForm.Width := Self.Width; end; end; procedure tform6.FormCreate(Sender: TObject); var IniFile: TIniFile; SectionsList: TStringList; //für die Verbindungsliste TempStr: String; I: Integer; begin EditFilter.Text := sDefaultFilterText; // Informationen über die aktuellen Datenbankverbindungen ermitteln IniFile := TIniFile.Create(GetConnectionRegistryFile); // Eine Liste der verfügbaren Datenbankverbindungen ermitteln SectionsList := TStringList.Create; IniFile.ReadSections(SectionsList); // Die Verbindungen in das Kombinationsfeld einfügen // Jede gültige Verbindung sollte mit den Zeichen 'CONNECTION' enden. // Nur diese Verbindungen werden hinzugefügt. SectionsList.Sort; for I := 0 to SectionsList.Count - 1 do begin TempStr := UpperCase(AnsiRightStr(SectionsList[I], Length('connection'))); if TempStr = 'CONNECTION' then begin ComboBoxConnections.Items.Add(SectionsList[I]); end; end; // Nicht mehr benötigte Objekte freigeben FreeAndNil(IniFile); FreeAndNil(SectionsList); end; procedure tForm6.listbox1DblClick(Sender: TObject); var s : string; FieldNamesList: TStringList; SQLStmt: String; I: Integer; begin // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren. CheckBoxActive.Enabled := True; ButtonApply.Enabled := True; TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen // Feldnamen (Spaltennamen) für diese Tabelle abrufen. FieldNamesList := TStringList.Create; FieldNamesList.Clear; SQLConnection1.GetFieldNames(TableName, FieldNamesList); if FieldNamesList.Count > 0 then begin SQLStmt := 'select '; for I := 0 to FieldNamesList.Count - 1 do if s = '' then s := FieldNamesList[I] else s := s + ',' + FieldNamesList[I]; SQLStmt := SQLStmt + s + ' from '+TableName; end else // Feldnamen nicht gefunden, daher '*' verwenden SQLStmt := 'select * from '+TableName; FreeAndNil(FieldNamesList); // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen. EditSQL.Text := SQLStmt; // CommandText auf SQL-Anweisung setzen. SQLDataSet1.CommandText := EditSQL.Text; if ClientDataSet1.Active then ClientDataSet1.Close; ClientDataSet1.Open; CheckBoxActive.Checked := True; end; end. Falls du noch schlafen gehst, :-) wünsche ich gute Nacht & Danke für alles |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz