Von SQL-DB nach SQL-DB kopieren
Von SQL-DB nach SQL-DB kopieren
Hallo,
habe da ein Problem wo ich gerade ganz schön auf dem Schlauch stehe.
Ich habe 2 Datenbanken. Eine Interbase die mit Daten gefüllt ist, und eine SQL Server die Leer ist.
Ich möchte nun gerne die Interbase in die SQL kopieren.
Das anlegen der Tabellen nach dem ich diese vorher aus interbase ausgelesen habe klappt super. Nur jetzt möchte ich die Tabellen gerne von IB nach SQL kopieren. Aber mhhh da hab ich grad keine Idee wie ich das machen könnte.
Ich habe 2 QSqlDatabase - Objekte: 1 für jede DB. Ein querry a la "SELECT * FROM TABELLE" würde mir ja liefern was ich suche... nur wie füge ich das dann in die 2. DB ein??
Grüße!
habe da ein Problem wo ich gerade ganz schön auf dem Schlauch stehe.
Ich habe 2 Datenbanken. Eine Interbase die mit Daten gefüllt ist, und eine SQL Server die Leer ist.
Ich möchte nun gerne die Interbase in die SQL kopieren.
Das anlegen der Tabellen nach dem ich diese vorher aus interbase ausgelesen habe klappt super. Nur jetzt möchte ich die Tabellen gerne von IB nach SQL kopieren. Aber mhhh da hab ich grad keine Idee wie ich das machen könnte.
Ich habe 2 QSqlDatabase - Objekte: 1 für jede DB. Ein querry a la "SELECT * FROM TABELLE" würde mir ja liefern was ich suche... nur wie füge ich das dann in die 2. DB ein??
Grüße!
-
CaptnChaos
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten:
Hi und danke für die schnelle AW!
Ich habs bisher folgendermaßen probiert:
soweit so gut. die liste kann ich wenn ich sie mir als record mache auch gut ansehen. allerdings weiß ich nicht wie ich das query ergebnis von der Interbase in die SQL reinbekomme...
Kannst du das kurz erläutern wie du das gemeint hast?
Die Tabellen habe ich bereits ausgelesen und so in der SQL angelegt. Datentypen müssten passen(nicht ganz sicher ob es zb unterschiede von time nach timestamp gibt oä)
Ginge es evtl über nen record? da bin ich grad am machen... weiß nur leider nicht was schief geht da ich den last error da nicht finde
Ich habs bisher folgendermaßen probiert:
Code: Alles auswählen
QSqlQuery queryIB(objQIbaseDb);// Obj von QSQLDatabase
QSqlQuery querySQL(objQSqlDb); // s.o.
queryIB.exec("SELECT * FROM T_ANSCHLUSS"); // hier stehen die ergs
querySQL.exec("SELECT * FROM T_ANSCHLUSS"); //empty
Kannst du das kurz erläutern wie du das gemeint hast?
Die Tabellen habe ich bereits ausgelesen und so in der SQL angelegt. Datentypen müssten passen(nicht ganz sicher ob es zb unterschiede von time nach timestamp gibt oä)
Ginge es evtl über nen record? da bin ich grad am machen... weiß nur leider nicht was schief geht da ich den last error da nicht finde
Code: Alles auswählen
while(queryIB.next())
{
RecordSQL.insert(i, queryIB.record().field(i));
}
So hier mal der Src
Die textausgabe mittel dem QString zeigen das in RecordSQL die Daten so rein übernommen werden wie Sie auch im IB Record drin stehen. Nur leider tut sich nix in der DB....
Was mache ich denn verkehrt?? Und gibt es da irgendeine Möglichkeit sich ggf. Fehler ausgeben zu lassen? query.lastError ist bei mir stets aus "".
Besten Dank für Hilfe!
Code: Alles auswählen
QSqlQuery queryIB(objQIbaseDb);
QSqlQuery querySQL(objQSqlDb);
queryIB.exec("SELECT * FROM T_ANSCHLUSS");
querySQL.exec("SELECT * FROM T_ANSCHLUSS");
WriteDebugBox("",true);
QSqlRecord RecordIB = queryIB.record();
QSqlRecord RecordSQL = querySQL.record();
int count = queryIB.record().count() ;
int i = 0;
while(queryIB.next())
{
for(int z = 0; z < count; z++)
{
if (queryIB.record().field(0).value().asString() != "1")
{
RecordSQL.insert(z, queryIB.record().field(z));
QString fa = queryIB.record().field(z).value().toString();
fa = RecordSQL.value(z).asString();
}
}
WriteDebugBox( querySQL.lastError().text());
querySQL.next();
}
Was mache ich denn verkehrt?? Und gibt es da irgendeine Möglichkeit sich ggf. Fehler ausgeben zu lassen? query.lastError ist bei mir stets aus "".
Besten Dank für Hilfe!
Ok also mit den Hardcodierten queries geht es schonmal...
allerdings bin ich damit ja überhaupt nicht dynamisch. Oder gibt es da eine Fkt die mir die Spaltennamen liefert??
Und dann haben ja nicht alle Tabellen die gleiche Anzahl an Spalten- Das heisst man müsste das addbindValue auch irgendwie umgestalten.... aber wie??
allerdings bin ich damit ja überhaupt nicht dynamisch. Oder gibt es da eine Fkt die mir die Spaltennamen liefert??
Und dann haben ja nicht alle Tabellen die gleiche Anzahl an Spalten- Das heisst man müsste das addbindValue auch irgendwie umgestalten.... aber wie??
Code: Alles auswählen
querySQL.prepare("INSERT INTO T_ANSCHLUSS (NUMMER, NAME_INTERN, BEZEICHNUNG, PROGRAMMIERBAR) "
"VALUES (?, ?, ?, ?)");
querySQL.addBindValue(101);
querySQL.addBindValue("Thad564");
querySQL.addBindValue("6500");
querySQL.addBindValue(1);
querySQL.exec();
-
CaptnChaos
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten:
Die Tabellen einer Datenbank:
Um die Spalten einer Tabelle zu bekommen:
Code: Alles auswählen
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//... db initialisieren
QStringList tabellen = db.tables();Code: Alles auswählen
for(int i = 0; i < QSqlDatabase::database().record(tablename).count(); ++i)
spaltenList->addItem(QSqlDatabase::database().record(tablename).fieldName(i));Poste hier mal den Code zum übernehmen der Werte von einer Tabelle in eine andere. Den Command string muss man noch Formen. Bei Interess- einfach PN.
Code: Alles auswählen
while(queryIB.next())
{
for (int p = 0; p < colCount; p++)
{
if (qsl_colNamesBU[p].compare("NUMMER") == 0)
{}//continue;
else if (qsl_colNamesBU[p].compare("DATUM") != 0 && qsl_colNamesBU[p].compare("ZEIT") != 0)
{
if (qsl_colNamesBU[p].compare("MODELL") == 0)
{
QString dummy = queryIB.record().field(p).value().toString().trimmed().replace('?','_');
VarList[p] << queryIB.record().field(p).value().toString().trimmed().replace('?','_')/* << QVariant(QVariant::String)*/;
}
else
{
//VarList.resize(VarList.size() - 1);
QString dummy = queryIB.record().field(p).value().toString();
VarList[p] << queryIB.record().field(p).value().toString().trimmed()/* << QVariant(QVariant::String)*/;
}
}
}
}
for (int p = 0; p < colCount; p++)
{
if (VarList[p].size())
querySQL.addBindValue(VarList[p]);
}
querySQL.execBatch();
Ich kenne deinen db typ nicht aber in mysql + sqlite3 geht es:
const QString infost = QString("SHOW CREATE TABLE %1").arg(tablein);
der ganze code ist in:
http://ppk.ciz.ch/qt_c++/mysql_model_browser/
vielleicht kannst du es fuer deine db aendern ...
const QString infost = QString("SHOW CREATE TABLE %1").arg(tablein);
Code: Alles auswählen
QString GrepTable::SqlCreateTable( const QString tablein )
{
QString stru;
QString tablex = tablein;
const QString takia = QString("`%1`").arg(tablex.toLower());
const QString takiunix = QString("`%1`").arg(tablex.toUpper());
const QString infost = QString("SHOW CREATE TABLE %1").arg(tablein);
QSqlQuery query(infost,db);
QSqlRecord rec = query.record();
while (query.next()) {
stru = query.value(1).toString();
Q_ASSERT(stru.size() > 1);
if (OSWinServer()) { /* uppercase on window =! */
stru = stru.replace(takia,takiunix);
}
stru.append(";\n");
}
return stru;
}
der ganze code ist in:
http://ppk.ciz.ch/qt_c++/mysql_model_browser/
vielleicht kannst du es fuer deine db aendern ...
.........................
speack português italiano deutsch english castellà qt
speack português italiano deutsch english castellà qt