Seite 1 von 1

Von SQL-DB nach SQL-DB kopieren

Verfasst: 15. August 2008 10:41
von AuE
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!

Verfasst: 15. August 2008 12:22
von CaptnChaos
Per Querys...
Du musst erst alle Datenbanken aus der ersten in die zweite übernehmen.
"create table"
dann gehste du tabelle für tabelle durch und übernimmst jeden wert einzeln per sql query.

Verfasst: 15. August 2008 13:01
von AuE
Hi und danke für die schnelle AW!

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

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

Code: Alles auswählen

while(queryIB.next())
{
	RecordSQL.insert(i, queryIB.record().field(i));
}

Verfasst: 15. August 2008 14:00
von AuE
So hier mal der Src

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();
}
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!

Verfasst: 15. August 2008 15:13
von AuE
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??

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();


Verfasst: 18. August 2008 15:38
von CaptnChaos
Die Tabellen einer Datenbank:

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	//... db initialisieren
	QStringList tabellen = db.tables();
Um die Spalten einer Tabelle zu bekommen:

Code: Alles auswählen

for(int i = 0; i <  QSqlDatabase::database().record(tablename).count(); ++i)
		spaltenList->addItem(QSqlDatabase::database().record(tablename).fieldName(i));

Verfasst: 12. September 2008 16:04
von AuE
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();



Verfasst: 12. September 2008 17:58
von patrik08
Ich kenne deinen db typ nicht aber in mysql + sqlite3 geht es:
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 ...

Verfasst: 15. September 2008 07:35
von AuE
ok sieht ganz nett aus.... nur was kann ich damit jetzt verbessern?