in .sql Tabelle schreiben / erzeugen / MFC

mats_MF

Mitglied
Hallo,

ich möchste anstatt immer ewig in txt Dateien zu schreiben in eine .sql Tabelle schreiben, da man damit ja bekanntlich mehr Möglichkeiten hat. Ich habe sql und auch SQLlite.

Es muss doch irgendwie gehen sqllite als query brwoser zu nutzen und die Daten dort wie in einer Textdatei mit INSERT etc. in einer Tabelle zu schreiben.

kann ich da am besten mit CDatabas arbeiten? Wass muss ich dazu includieren?

Ich muss mir ja einen Strin erzeugen, der die Servereigenschaften für die .sql hat. Mit Sqlliste könnte ich doch dann (wie) die die vorhandene Tabelle wie mit dem QueryBrowser schreiben oder bin ich da auf dem falschen Dampfer um brauch noch Oracle oder Tamino oder so...?

Code:
void CTestdialog::OnBnClickedTestdialogSqltest()
{

//SetStrin localhost/root/pw/...
	
///open(/open.ex(

...

Insert * from ....
}

vielen dank schon mal
 

pschilling

Erfahrenes Mitglied
Hi,
also das einfachste ist es, wenn du für deine Datenbank eine ODBC-Verbindung einrichtest.

Dann includierst du die Datei afxdb.h.

Und so schiesst du Daten in deine DB :

Code:
    CDatabase db;
    if( !db.OpenEx("DSN=blabla;UID=blabla;PWD=blabla",0 ) ) {
        // Fehler beim Öffnen!
        return FALSE;
    }
    CString stmt = "insert into blabla ... VALUES(...)"; 
    db.ExecuteSQL(stmt); 
    db.Close();


Damit solltest du ziemlich schnell Daten einfügen können.

Wenn du selects ausführen möchtest macht du des dann mit der Klasse CRecordset.. Aber dann kannste ja noch mal was posten wenns da Probleme gibt ;-)

Schönen Gruß,

Peter
 

mats_MF

Mitglied
Hi,

erst mal danke für die Antwort. Bei mir klappt soweit alles öffnen/einfügen/löschen/Positionen löschen/umbenennen etc.

Da meine SW recht selten neu gestartet wird zwinge ich den DB Dialog von Windows, damit ein Wahl der DB möglich ist.

Code:
//direkt verbinden
//db.OpenEx( _T("DSN=blubbla;UID=root;PWD=lierumlaarum", Database::useCursorLib|CDatabase::forceOdbcDialog));
	
if(db.OpenEx( NULL, CDatabase::forceOdbcDialog )==IDOK)
 return 1;
else
 return 0;

//......
//erstelle tabellen
CString Values,InsertString, EPO, EPU, KOPF,Kartenadresse, Sensoradresse;	Values="(Endpunkt int,Spannung int,Strom float,Temperatur int,Prüfplatznummer int,Datum char(50),Kommentar char(100))";
	InsertString="CREATE TABLE "+Table+"_EPO "+Values;
	db.ExecuteSQL(InsertString);
	InsertString="CREATE TABLE "+Table+"_EPU "+Values;
	db.ExecuteSQL(InsertString);
//...
//....exportiere diese
ExportTable="'"+ActualTable+"_EPO.XLS'";    
		InsertString="SELECT * FROM "+ActualTable+"_EPO INTO OUTFILE "+ExportTable;
		db.ExecuteSQL(InsertString);
//.... füger Werte ein..
CString Beschreibung, Werte;
	Beschreibung="BESCHREIBUNG";
	Werte = "WERTE";
	InsertString="INSERT INTO "+Table+"_PROTOCOL (Beschreibung,Werte) VALUES ('" + Beschreibung + "', '" + Werte +"')";
	db.ExecuteSQL(InsertString);


Wo ich am meisten dran gehangen habe, war das Einfügen via Variablen und diese Hochkommatas.
Umständlich ist nur das Durchlaufen ein Tabelle, um alle werte zu erfassen. Aber es geht auch so.

Code:
DBVariant Wert;
    int value,mittlere_SPG=0,min_SPG=999,max_SPG=0;
	float value_flt,mittlerer_STROM=0,min_STROM=999,max_STROM=0;
	int mittlere_TEMP=0,max_TEMP=0,min_TEMP=999;
	 CRecordset rs( &db );
    rs.Open( CRecordset::forwardOnly, _T( "SELECT * FROM "+Table+"_EPO"));
  
 //  CODBCFieldInfo
   int n = rs.GetODBCFieldCount( );  //Anzahl der Spalten ermitteln
   int zeile1=0;
   while( !rs.IsEOF() )
   {
      for( int i =0; i < n; i++ )
      {    
	if(i==1)
	{
	 rs.GetFieldValue( i, Wert );
	 value=Wert.m_boolVal;

	  if(zeile1==0)
	    mittlere_SPG=value;
   	 mittlere_SPG=(mittlere_SPG+value)/2;
	if(min_SPG>=value)
	 min_SPG=value;
	if(max_SPG<=value)
	 max_SPG=value;
						
	}
       }

      rs.MoveNext( );
      zeile1++; //hier stehen jetzt auch die Anzahl der zeilen drinne ;-)
   }
   rs.Close( );

//.....

Vielleicht war ja auch etwas brauchbares für Dich dabei ;-)

Danke & Gruß