SQL Befehle direkt an DB senden <= Problem gelöst
-
Hi zusammen ich würde gerne keine gewöhnliche query senden, sondern eine richtige Befehlsfolge. Über welche Funktion bekomme ich das hin? Kann ich das gleich in der open machen? Oder wie verwende ich SQLexecdirect? Ich dachte dass ich meinSet.SQLexecdirekt machen kann, das geht aber nicht! Ich will halt z.B. sowas an die DB senden:
Create table #tmp_Auswertung (Zaehler int, Motornummer char (10)) Go
Danke schon im Voraus für jegliche Art von Info.
-
Hi!
Hast du es schonmal so versucht:
CDaoDatabase* m_daoDatabase = new CDaoDatabase(); m_daoDatabase->Open("C:\\MyDB.mdb"); CString SqlCmd = "CREATE Table..."; m_daoDatabase->Execute(SqlCmd);
Gruß
Chris
-
nein aber werde ich am Montag gleich mal probieren. Werde mich hier dann nochmal melden, vielen Dank schon im Voraus
mfg Polo
-
also ich hab das mal probiert, aber nicht über DaoDatabase sondern so:
CString SqlCmd1 = "Create table #tmp_Auswertung (Zaehler int, MotorNummer char (10)) Go"; CString SqlCmd2 = "INSERT INTO #Tmp_Auswertung ( Zaehler, MotorNummer) SELECT Max(dbo.TRWErgebnisse.Zaehler) AS MaxOfZaehler, dbo.TRWErgebnisse.MotorNummer FROM dbo.TRWErgebnisse GROUP BY dbo.TRWErgebnisse.MotorNummer Go"; CString SqlCmd3 = "SELECT Count (*) AS ANZAHL, dbo.TRWErgebnisse.MotorGut FROM dbo.#tmp_Auswertung INNER JOIN dbo.TRWErgebnisse ON dbo.#tmp_Auswertung.Zaehler = dbo.TRWErgebnisse.Zaehler AND dbo.#tmp_Auswertung.Motornummer = dbo.TRWErgebnisse.MotorNummer GROUP BY dbo.TRWErgebnisse.MotorGut"; CString SqlCmd4 = "Drop table #Tmp_Auswertung"; db.Open( _T("ACR"),FALSE,true,_T("ODBC;UID=anyusr;PWD=anyusr"),false); CRecordset Set(&db); db.ExecuteSQL(SqlCmd1); db.ExecuteSQL(SqlCmd2); Set.Open(CRecordset::dynaset | CRecordset::forwardOnly, SqlCmd3); if(!Set.IsEOF()) { Set.GetFieldValue("ANZAHL", strAnzahl); } db.ExecuteSQL(SqlCmd4); Set.Close(); return strAnzahl; }
Wenn ich das aber ausführe bekomme ich nen Fehler und zwar:
---------------------------
ACRSQL
---------------------------
Zeile 1: Falsche Syntax in der Nähe von 'Go'.---------------------------
OK
---------------------------Kann mir einer helfen?
Ist echt wichtig!
-
Was passiert, wenn du die "Go" wegläßt?
PS: Mach mal nen Zeilenumbruch, der Beitrag ist ein bisserl breit.
-
Wenn ich Go weglasse dann sagt er
---------------------------
ACRSQL
---------------------------
Die Verbindung ist mit Ergebnissen von einem anderen hstmt belegt.---------------------------
OK
---------------------------was heißt das??
-
hab zwar immer noch keine Ahnung was das bedeutet, aber ich hab durch probieren herausgefunden, dass wenn ich einen Command weglasse, dann geht es irgendwie! Aber ich brauch alle 4! Was geht da schief?
-
Welchen musst du denn weglassen?
-
ist völlig egal, aber das einzigste was ich weglassen kann, dass er mir mein richtiges ergebnis liefert ist natürlich das drop table. wenn ich aber das select count (*) ... weglasse ginge es auch, nur bekomm ich da dann natürlich kein ergebnis zurück!
-
Was passiert, wenn du die beiden Zeilen tauschst?
db.ExecuteSQL(SqlCmd4); Set.Close();
-
WOW deine Idee klappt! Und jetzt halt dich fest, ich hab auch die Erklärung dazu! Wenn man sich ein bischen Gedanken macht und liest.
Diese Fehlermeldung kommt immer dann wenn eine Transaktion ausgeführt wird, die nicht mit einem Commit abgeschlossen wird und die nächste über den selben Kanal läuft. SQL Server ist nich richtig in der Lage zwei Transaktionen über denselben Kanal zu steuern.
Eine weitere Lösung wäre ein Commit zwischen rein zu sennden!
-
Na super.
Ist irgendwie logisch, wenn man es weiß.
-
wie eigentlich mit jedem Problem!
Aber gell hättest nicht gedacht dass ich hier so ne kompetente Lösung parat hab.
Wenn ich ehrlich bin ich hätte es auch nicht gedacht.