Von SQL-DB nach SQL-DB kopieren

Alles rund um die Programmierung mit Qt
Antworten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Von SQL-DB nach SQL-DB kopieren

Beitrag 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!
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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));
}
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

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

CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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));
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

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


patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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 ...
.........................
speack português italiano deutsch english castellà qt
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

ok sieht ganz nett aus.... nur was kann ich damit jetzt verbessern?
Antworten