Query bei einer Datenbank
-
Na super!! Dank dir schon einmal.. Hast mir richtig geholfen.
Auf dem Zielrechner muss dann Excel installiert sein und keine weiteren Treiber oder?
from [Tabelle1$]
.. das hatte mir gerade gefehlt da hatte ich die xls hingeschrieben.
-
Frage:
Als ich die sache mit BDE gemacht habe konnte ich in der SQL mit Variablen arbeiten mit ParamByName ...
ADOQuery1->ParamByName("VARIABLE")->Value = Edit1->Text;
Das scheint hier in der SQL nicht zu funktionieren... Gibts da noch eine andere möglichkeit die sql mit variablen zu bestücken?
-
das geht auch hier, allerdings mit leicht verändertem Syntax:
ADOCommand1->Parameters->ParamByName("VARIABLE")->Value = Edit1->Text;
-
Da bringt er mir immer die Fehlermeldung Parameter X nicht gefunden...
Auszug:
String x; ADOConnection1->ConnectionString = "Provider=MSDASQL;Persist Security \Info=False;Data Source=Excel-Dateien;Initial Catalog=test.xls"; ADOConnection1->LoginPrompt = false; ADOConnection1->Open(); ADODataSet1->Connection = ADOConnection1; ADODataSet1->CommandText = "[Tab20$]"; ADODataSet1->CommandType = cmdTable; ADODataSet1->Open(); ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select id from [Tab20$] where smms like :x"); ADOCommand1->Parameters->ParamByName("x")->Value = Edit1->Text; ADOQuery1->Open(); ADOQuery1->First(); Memo1->Lines->Add(ADOQuery1->Fields->Fields[0]->AsString);
-
kann auch nicht gehen, da du den Parameter dem ADOCommand und nicht dem Query zuordnest. Ausserdem brauchst du das Query nicht mehr:
String x; ADOConnection1->ConnectionString = "Provider=MSDASQL;Persist Security \Info=False;Data Source=Excel-Dateien;Initial Catalog=test.xls"; ADOConnection1->LoginPrompt = false; ADOConnection1->Open(); ADODataSet1->Connection = ADOConnection1; ADODataSet1->CommandText = "select id from [Tab20$] where smms like :x"; ADODataSet1->CommandType = cmdText; ADODataSet1->Parameters->ParamByName("x")->Value = Edit1->Text; ADODataSet1->Open(); ADODataSet1->First(); Memo1->Lines->Add(ADODataSet1->Fields->Fields[0]->AsString);
-
Na jetzt wird es tag!!!
-
Hi all,
ich wollte mich an dieser Stelle noch einmal Bedanken für Eure super Hilfe!!!
Jetzt läuft das grobe alles wunderbar.
THX!!!
-
hi zusammen,
ich komme einfach nicht weiter, warscheinlich übersehe ich nur ne kleinigkeit.
zur erläuterung:
ich möchte eine excel datei in eine sql datenbank importieren. hierbei soll geprüft werden ob der datensatz in der datenbank schon vorhanden ist oder nicht. ist dieser vorhanden, dann soll dieser in den edit modus gesetzt werden und überschrieben werden. ist der datensatz noch nicht vorhanden, dann soll die datenbank auf append gesetzt werden und der datensatz angefügt werden.
hierzu gehe ich hin und überprüfe auf das feld "titel".
nur irgendwie will das ganze nicht wirklich funktionieren. in der ausführung gibt er immer an das dieser datensatz noch nicht vorhanden ist.
zur verdeutlichung hier nun der quelltext ( in abgespeckter variante )void __fastcall Tfrm_import::cmd_importClick(TObject *Sender) { Connection_excel->ConnectionString = "Provider=MSDASQL;Persist Security \Info=False;Data Source=Excel-Dateien;Initial Catalog = '" + excel + "'"; Connection_excel->LoginPrompt = false; Connection_excel->Open(); ADODataSet1->Connection = Connection_excel; ADODataSet1->CommandText = "[Tabelle1$]"; ADODataSet1->CommandText = "SELECT Titel, Kategorie, Format, Anzahl, Bemerkung FROM [Tabelle1$]"; ADODataSet1->CommandType = cmdText; ADODataSet1->Open(); ADODataSet1->First(); queryimport->First(); ProgressBar1->MaxValue = ADODataSet1->RecordCount; ProgressBar1->Progress = 0; for(int i = 0; i < ADODataSet1->RecordCount; i++) { if(queryimport->FieldByName("titel")->AsString == ADODataSet1->FieldByName("Titel")->AsString) { queryimport->Edit(); // dient jetzt nur zum testen, normalerweise die sql anweisungen Application->MessageBoxA("0","",MB_OK); } if(queryimport->FieldByName("titel")->AsString != ADODataSet1->FieldByName("Titel")->AsString) { queryimport->Append(); // dient jetzt nur zum testen, normalerweise die sql anweisungen Application->MessageBoxA("1","",MB_OK); } ProgressBar1->Progress = ProgressBar1->Progress +1; ADODataSet1->Next(); } ProgressBar1->Progress = 0; }
warum wird nicht erkannt das ein titel in der datenbank vorhanden ist?
anmerkung:
die felder in der datenbank sind vom typ nvarchar (mssql)ich hoffe das mir einer helfen kann
danke schon mal im voraus für eure mühen
gruß
Avalon
-
wie ist queryimport definiert?
-
hi Linnea,
Linnea schrieb:
wie ist queryimport definiert?
SELECT * FROM tbl_filme
hab das prob nun auf folgende art gelöst:
void __fastcall Tfrm_import::cmd_importClick(TObject *Sender) { Connection_excel->ConnectionString = "Provider=MSDASQL;Persist Security \Info=False;Data Source=Excel-Dateien;Initial Catalog = '" + excel + "'"; Connection_excel->LoginPrompt = false; Connection_excel->Open(); ADODataSet1->Connection = Connection_excel; ADODataSet1->CommandText = "[Tabelle1$]"; ADODataSet1->CommandText = "SELECT Titel, Kategorie, Format, Anzahl, Bemerkung FROM [Tabelle1$]"; ADODataSet1->CommandType = cmdText; ADODataSet1->Open(); ADODataSet1->First(); queryimport->First(); ProgressBar1->MaxValue = ADODataSet1->RecordCount; ProgressBar1->Progress = 0; for(int i = 0; i <= ADODataSet1->RecordCount; i++) { AnsiString titel = ADODataSet1->FieldByName("Titel")->AsString; queryimport->Close(); queryimport->SQL->Clear(); queryimport->SQL->Add("SELECT * FROM tbl_filme"); queryimport->SQL->Add("WHERE titel = '" + titel + "'"); queryimport->Open(); if(queryimport->RecordCount == 0) { queryimport->Append(); queryimport->FieldByName("titel")->AsString = ADODataSet1->FieldByName("Titel")->AsString; queryimport->FieldByName("kategorie")->AsString = ADODataSet1->FieldByName("Kategorie")->AsString; queryimport->FieldByName("format")->AsString = ADODataSet1->FieldByName("Format")->AsString; queryimport->FieldByName("anzahl")->AsString = ADODataSet1->FieldByName("Anzahl")->AsString; queryimport->FieldByName("bemerkung")->AsString = ADODataSet1->FieldByName("Bemerkung")->AsString; queryimport->FieldByName("bild")->AsString = ".\\images\\nopic.jpg"; queryimport->Post(); } if(queryimport->RecordCount == 1) { queryimport->Edit(); queryimport->FieldByName("titel")->AsString = ADODataSet1->FieldByName("Titel")->AsString; queryimport->FieldByName("kategorie")->AsString = ADODataSet1->FieldByName("Kategorie")->AsString; queryimport->FieldByName("format")->AsString = ADODataSet1->FieldByName("Format")->AsString; queryimport->FieldByName("anzahl")->AsString = ADODataSet1->FieldByName("Anzahl")->AsString; queryimport->FieldByName("bemerkung")->AsString = ADODataSet1->FieldByName("Bemerkung")->AsString; queryimport->FieldByName("bild")->AsString = ".\\images\\nopic.jpg"; queryimport->Post(); } ProgressBar1->Progress = ProgressBar1->Progress +1; ADODataSet1->Next(); } ProgressBar1->Progress = 0; queryimport->Close(); ADODataSet1->Close(); Label2->Visible = true; cmd_import->Enabled = false; }
jetzt erkennt er endlich ob ein datensatz vorhanden ist oder nicht. wie im vorherigen post kann das ja auch nicht funktionieren da ich jede zeile der excel mit der ersten zeile der sql vergleiche.
evtl lässt sich mein code hier noch etwas effectiver, bzw schlanker gestalten ?gruß
Avalon