Frage

Ist es möglich, Ausführen 2 Insert oder Update-Anweisungen mit cfquery?

Wenn ja, wie?

Wenn nein, was ist der beste Weg, um mehrere Abfragen in Coldfusion auszuführen, indem nur eine Verbindung zur DB zu öffnen.

Ich denke, jedes Mal, wenn wir cfquery nennen wir neue Verbindung DB

öffnen
War es hilfreich?

Lösung

Im Rahmen der Datenquellen-Einstellungen können Sie ihm sagen, ob Verbindungen offen halten oder nicht mit den Verbindungen Einstellung beibehalten.

Beginnend mit, glaube ich, Coldfusion 8-Datenquellen eingerichtet sind, nur eine Abfrage zu einem Zeitpunkt ausgeführt wird aufgrund von Bedenken mit SQL-Injection. Um dies zu ändern müssen Sie mit der Verbindungszeichenfolge ändern.

Am besten ist es einzuschalten Verbindungen pflegen und bei Bedarf Gebrauch cftransaction:

<cftransaction>
<cfquery name="ins" datasource="dsn">
insert into table1 values(<cfqueryparam value="#url.x#">)
</cfquery>
<cfquery name="ins" datasource="dsn">
insert into table2 values(<cfqueryparam value="#url.x#">)
</cfquery>
</cftransaction>

Und immer, immer cfqueryparam für von den Benutzern eingereicht Werte verwenden.

Andere Tipps

  

Ist es möglich, Ausführen 2 Einsatzes oder   Update-Anweisungen mit cfquery?

Wahrscheinlich ja. Aber ob Sie mehrere Anweisungen ausführen kann, wird durch Ihren Datenbanktyp und Treiber / Verbindungseinstellungen festgelegt. Zum Beispiel, wenn Sie eine MS SQL-Datenquelle zu erstellen, IIRC sind mehrere Anweisungen standardmäßig zugelassen. Während MySQL-Treiber häufig deaktivieren mehr Anweisungen standardmäßig. Das heißt, um SQL-Injection zu vermeiden. Also in diesem Fall müssen Sie mehrere Aussagen explizit in Ihren Verbindungseinstellungen aktivieren. Sie können aber nicht mehrere Anweisungen verwenden. Es gibt auch einige Datenbanken (in der Regel Desktop diejenigen wie MS Access), die überhaupt nicht mehr Anweisungen unterstützen. Also ich glaube nicht, dass es eine Decke Antwort auf diese Frage ist.

Wenn die beiden insert / update-Anweisungen verwandt sind, sollten Sie auf jeden Fall einen cftransaction verwenden, wie Sam vorgeschlagen. Das sichert die Aussagen werden als eine Einheit behandelt: also entweder sie alle Erfolg haben oder sie alle scheitern. Sie sind also nicht mit partiellen oder inkonsistenten Daten verlassen. Um das zu erreichen, wird eine einzige Verbindung für beiden Abfragen in der Transaktion verwendet werden.

  

denke ich jedes Mal, nennen wir cfquery wir   eröffnen neue Verbindung DB

Wie Sam erwähnt, dass hängt von Ihren Einstellungen und ob Sie mit cftransaction. Wenn Sie (unter Datenquelle Einstellungen im Administrator CF) pflegen Verbindungen ermöglichen CF einen Pool von offenen Verbindungen aufrechtzuerhalten. Also, wenn Sie eine Abfrage ausführen, CF packt nur eine offene Verbindung aus dem Pool, anstatt einem neuen jedes Mal zu öffnen. Wenn cftransaction verwendet, soll die gleiche Verbindung für alle Abfragen verwendet werden. Unabhängig davon, ob Verbindungen pflegen aktiviert ist oder nicht.

die mySQL-Treiber in CF8 haben nun mehr Aussagen ermöglichen. wie Sam sagt, können Sie zu gruppieren viele Aussagen zusammen verwenden oder in Coldfusion Administrator | Daten & Service | Datenquellen, hinzufügen allowMultiQueries = true zum Connection String-Feld

Ich habe keine CF-Server haben, um zu versuchen, aber es sollte in Ordnung IIRC arbeiten.

so etwas wie:

<cfquery name="doubleInsert" datasource="dsn">
insert into table1 values(x,y,z)
insert into table1 values(a,b,c)
</cfquery>

Wenn Sie ein konkretes Beispiel wollen Sie persönliche Informationen geben.

Edit: Dank @SamFarmer: Neuere Versionen von CF als ich verwendet habe, kann dies verhindern

Sorry für die Necro (Ich bin neu auf der Seite).

Du hast nicht erwähnt, was DB Sie verwenden. Wenn Sie geschehen, mySQL zu verwenden, können Sie hinzufügen, wie viele Datensätze als die maximale Speichergröße ermöglicht.

ich einfügen up regelmäßig auf ~ 4500 Datensätze gleichzeitig mit der Standard-Heap-Größe (aber das wird von der Menge der Daten ab, die Sie haben).

INTO Yourtable Einsatz (x, y, z) VALUES ( 'a', 'b', 'c'), ( 'd', 'E', 'F'), ( 'g', 'h' , 'i')

Alle DBs sollten diese IMO tun.

HTH

Verwenden CFTRANSACTION gruppieren mehrere Abfragen in einer einzigen Einheit.

Alle Anfragen mit CFQUERY ausgeführt und zwischen und Tags werden als eine einzelne Transaktion behandelt. Änderungen an Daten, die von diesen Abfragen angefordert werden nicht in die Datenbank übernommen, bis alle Aktionen innerhalb der Transaktion Block erfolgreich ausgeführt haben. Wenn ein Fehler in einer Abfrage erfolgt, werden alle von früheren Abfragen innerhalb des Transaktionsblock vorgenommenen Änderungen werden rückgängig gemacht.

Mit der ISOLATION Attribute für zusätzliche Kontrolle darüber, wie der Datenbank-Engine führt während der Transaktion verriegelt wird.

Für weitere Informationen besuchen Sie http://www.adobe.com /livedocs/coldfusion/5.0/CFML_Reference/Tags103.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top