5 Stimmen

Wie führe ich 2 oder mehr Insert-Anweisungen mit CFQuery in Coldfusion aus?

Ist es möglich, 2 Einfüge- oder Aktualisierungsanweisungen auszuführen, indem man cfquery ?

Wenn ja, wie?

wenn nein, was ist der beste Weg, um mehrere Abfragen in Coldfusion auszuführen, indem nur eine Verbindung zur DB geöffnet wird.

Ich denke, jedes Mal, wenn wir anrufen cfquery wir öffnen eine neue Verbindung DB

5voto

Leigh Punkte 28605

Ist es möglich, 2 Einfügungen auszuführen oder Update-Anweisungen mit cfquery auszuführen?

Höchstwahrscheinlich ja. Ob Sie jedoch mehrere Anweisungen ausführen können, hängt vom Datenbanktyp und den Treiber-/Verbindungseinstellungen ab. Wenn Sie z. B. eine MS SQL-Datenquelle erstellen, sind mehrere Anweisungen standardmäßig erlaubt. Während MySQL-Treiber oft deaktivieren mehrere Anweisungen standardmäßig. Das soll helfen, Sql-Injection zu vermeiden. In diesem Fall müssen Sie also in Ihren Verbindungseinstellungen ausdrücklich mehrere Anweisungen aktivieren. Andernfalls können Sie keine Mehrfachanweisungen verwenden. Es gibt auch einige Datenbanken (in der Regel Desktop-Datenbanken wie MS Access), die mehrere Anweisungen überhaupt nicht unterstützen. Ich glaube also nicht, dass es eine pauschale Antwort auf diese Frage gibt.

Wenn die beiden Einfüge-/Aktualisierungsanweisungen miteinander verbunden sind, sollten Sie auf jeden Fall eine cftransaction verwenden, wie Sam vorgeschlagen hat. Dadurch wird sichergestellt, dass die Anweisungen als eine Einheit behandelt werden, d.h. entweder sind sie alle erfolgreich oder sie schlagen fehl. So werden keine unvollständigen oder inkonsistenten Daten hinterlassen. Um dies zu erreichen, wird eine einzige Verbindung für beide Abfragen in der Transaktion verwendet.

Ich denke, jedes Mal, wenn wir öffnen wir eine neue Verbindung DB

Wie Sam schon sagte, hängt das von Ihren Einstellungen ab und davon, ob Sie cftransaction verwenden. Wenn Sie "Maintain Connections" aktivieren (unter "Datasource settings" im CF Administrator), wird CF einen Pool offener Verbindungen unterhalten. Wenn Sie also eine Abfrage ausführen, greift CF einfach auf eine offene Verbindung aus dem Pool zurück, anstatt jedes Mal eine neue zu öffnen. Wenn Sie cftransaction verwenden, sollte für alle Abfragen dieselbe Verbindung verwendet werden. Unabhängig davon, ob Maintain Connections aktiviert ist oder nicht.

4voto

Sam Farmer Punkte 4098

In den Einstellungen der Datenquelle können Sie mit der Einstellung Verbindungen aufrechterhalten festlegen, ob die Verbindungen offen bleiben sollen oder nicht.

Ab, ich glaube, ColdFusion 8 Datenquellen sind so eingestellt, dass nur eine Abfrage zu einem Zeitpunkt aufgrund von Bedenken mit SQL-Injektion laufen. Um dies zu ändern, müssten Sie mit der Verbindungszeichenfolge ändern.

Am besten schalten Sie Maintain Connections ein und verwenden bei Bedarf 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 verwenden Sie immer, immer cfqueryparam für Werte, die von Nutzern übermittelt werden.

4voto

andrew lorien Punkte 41

Der mySQL-Treiber in CF8 erlaubt jetzt mehrere Anweisungen. wie Sam sagt, können Sie verwenden viele Aussagen zu gruppieren oder im Coldfusion-Administrator | Daten & Dienste | Datenquellen, hinzufügen. allowMultiQueries=true in das Feld Verbindungszeichenfolge

3voto

µBio Punkte 10482

Ich habe keinen CF-Server, um es auszuprobieren, aber es sollte gut funktionieren, IIRC.

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 konkreteres Beispiel wünschen, müssen Sie genauere Angaben machen.

Edita: Dank an @SamFarmer : Neuere Versionen von CF als die, die ich verwendet habe, können dies verhindern

1voto

genericHCU Punkte 4352

Entschuldigung für den Necro (ich bin neu auf der Website).

Sie haben nicht erwähnt, welche DB Sie verwenden. Wenn Sie mySQL verwenden, können Sie so viele Datensätze hinzufügen, wie die maximale Heap-Größe zulässt.

Ich füge regelmäßig bis zu ~4500 Datensätze auf einmal mit der Standard-Heap-Größe ein (aber das hängt von der Datenmenge ab, die Sie haben).

INSERT INTO yourTable (x,y,z) VALUES ('a','b','c'),('d','e','f'),('g','h','i')

Alle DBs sollten dies IMO tun.

HTH

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X