Diese Notiz beschreibt das Abrufen und senden die ODBC SQL_LONGVARCHAR und SQL_LONGVARBINARY -Datentypen verwenden die MFC-Datenbankklassen.
Übersicht über lange Varchar/Varbinary unterstützen
Die Datentypen ODBC SQL_LONG_VARCHAR und SQL_LONGBINARY (genannt hier lange Datenspalten) große Mengen an Daten aufnehmen können. Es gibt 3 Möglichkeiten, die Sie behandeln können, diese Daten:
Long-Datenspalten werden für die Parameter für eine Abfrage nicht unterstützt. Sie werden nur für OutputColumns unterstützt.
Binden einer Spalteninhalts mit langen Daten an ein CString/CByteArray
Vorteile:
Dieser Ansatz ist einfach zu verstehen, und Sie arbeiten mit bekannten Klassen. Das Framework unterstützt CFormView CString mit DDX_Text. Sie haben eine Menge allgemeine Zeichenfolge oder Funktionen mit der CString und CByteArray -Klasse, und Sie können steuern die Größe des Arbeitsspeichers, die lokal auf den Datenwert enthalten. Rahmen erhält eine alte Kopie von Felddaten während Bearbeiten oder AddNew -Funktionsaufrufe und Rahmen erkennt automatisch Änderungen an den Daten für Sie.
Hinweis&Nbsp; Da CString arbeiten Zeichendaten, und CByteArray zum Arbeiten auf Binärdaten vorgesehen ist, wird empfohlen, dass Sie die Zeichendaten (SQL_LONGVARCHAR) in CStringund die binären Daten (SQL_LONGVARBINARY) CByteArray.
Die RFX-Funktionen für die CString und CByteArray haben ein zusätzliches Argument ermöglicht Ihnen das Überschreiben der Standard-Größe des zugeordneten Speichers, den abgerufenen Wert für die Datenspalte zu halten. Beachten Sie das Argument nMaxLength in die folgenden Funktionsdeklarationen:
privatevoid AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
Nbsp; CString & Value, Int nMaxLength = 255, Int nColumnType =
SQL_VARCHAR);
privatevoid AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255)
Wenn Sie eine Spalte long-Daten in eine CString oder CByteArrayabrufen, zurückgegebene die maximale Datenmenge ist, standardmäßig, 255 Byte. Alles darüber hinaus wird ignoriert. In diesem Fall löst das Framework die Ausnahme AFX_SQL_ERROR_DATA_TRUNCATED. Glücklicherweise können Sie explizit nMaxLength, höhere Werte, bis zu MAXINT erhöhen.
ClassWizard bindet eine SQL_LONGVARCHAR an CStringoder eine SQL_LONGVARBINARY zu einem CByteArray für Sie. Wenn Sie mehr als 255 Bytes zuordnen, in denen Sie Ihre Spalte long-Daten abrufen, möchten, können Sie dann einen expliziten Wert für nMaxLength angeben.
Wenn eine Spalte long-Daten an ein CString oder CByteArraygebunden ist, funktioniert das Aktualisieren von Feld genau das gleiche wie wenn es an den SQL_VARCHAR oderVARBINARYSQL_ gebunden ist. Während Bearbeitenist den Datenwert Cache entfernt und später verglichen, wenn Update aufgerufen wird, um Änderungen an den Wert erkennen und die schmutzige und Null-Werte für die Spalte entsprechend gesetzt.
Binden einer Spalteninhalts mit langen Daten an ein CLongBinary
Wenn Ihre Spalte long-Daten mehr MAXINT -Bytes Daten enthalten kann, sollten vermutlich Sie es in ein CLongBinary abrufen.
Vorteile:
Dies ruft eine ganze lange Datenspalte - bis zum verfügbaren Arbeitsspeicher.
Nachteile:
Die Daten werden im Speicher gehalten. Dieser Ansatz ist auch für sehr große Mengen an Daten unerschwinglich teuer. Müssen Sie SetFieldDirty für den gebundenen Daten-Member, um sicherzustellen, dass das Feld in einer Update -Operation enthalten ist.
Wenn Sie lange von Datenspalten in einem CLongBinaryabrufen, werden die Datenbankklassen die Gesamtgröße der Spalte long-Daten überprüfen, dann ein HGLOBAL -Memory-Segment groß genug, um es zu halten den gesamten Datenwert zuweisen. Die Datenbankklassen dann Abrufen den gesamten Datenwert in der zugewiesenen HGLOBAL.
Wenn die Datenquelle die erwartete Größe der Spalte long-Daten zurückgeben kann, wird im Rahmen der AFX_SQL_ERROR_SQL_NO_TOTALAusnahme. Scheitert der Versuch, die HGLOBAL zuordnen, wird eine standard-Speicher-Ausnahme ausgelöst.
ClassWizard bindet ein SQL_LONGVARCHAR oder SQL_LONGVARBINARY an ein CLongBinary für Sie. Wählen Sie CLongBinary als Variable in das Dialogfeld Membervariable hinzufügen. Klassen-Assistent wird dann ein RFX_LongBinary ihn in Ihrem DoFieldExchange -Anruf hinzufügen und erhöht die Gesamtzahl der gebundenen Feldern.
Um lange Daten Spaltenwerte zu aktualisieren, stellen Sie zunächst sicher, dass die zugewiesenen HGLOBAL ist groß genug für die neuen Daten durch den Aufruf :: GlobalSize auf das M_hData Mitglied der CLongBinary. Wenn es zu klein ist, lassen Sie die HGLOBAL und ordnen Sie eine geeignete Größe . Legen Sie dann M_dwDataLength entsprechend die neue Größe.
Andernfalls ist M_dwDataLength größer als die Größe der Daten, die Sie ersetzen möchten, können Sie frei und Neuzuweisung der HGLOBALoder lassen Sie es zugeteilt. Stellen Sie sicher, geben Sie die Anzahl der Bytes, die tatsächlich verwendeten m_dwDataLength.
Wie aktualisieren arbeitet ein CLongBinary
Es ist nicht notwendig zu verstehen, wie ein CLongBinary Aktualisierung funktioniert, aber es kann als ein Beispiel, wie lange Datenwerte an eine Datenquelle gesendet nützlich sein wenn Sie diese dritte Methode unten beschriebenen wählen.
Hinweis&Nbsp; In Reihenfolge für ein Feld CLongBinary in einem Update enthalten werden müssen Sie explizit aufrufen, SetFieldDirty für das Feld. Wenn Sie Änderungen, um ein Feld vornehmen, einschließlich der Festlegung es Null, müssen Sie SetFieldDirty aufrufen.
Wenn ein CLongBinary -Feld aktualisieren, verwenden die Datenbankklassen ODBC DATA_AT_EXEC -Mechanismus (siehe ODBC-Dokumentation auf SQLSetPosRgbValue Argument). Wenn Rahmen bereitet das Insert oder Update-Anweisung statt, auf den HGLOBAL mit den Daten, die Adresse des die CLongBinary ist als der Wert der Spalte legen Sie stattdessen, und der Längenindikator auf SQL_DATA_AT_EXECfestgelegt. Später wenn die Update-Anweisung an die Datenquelle gesendet wird, gibt SQLExecDirect SQL_NEED_DATAzurück. Dadurch wird dem Rahmen, dass der Wert für diese Spalte die Param tatsächlich die Adresse des ein CLongBinaryist. Das Framework ruft SQLGetData einmal mit einem kleinen Puffer, erwartet den Fahrer, der die tatsächliche Länge der Daten zurück. Wenn der Treiber gibt die tatsächliche Länge des die binary large Object (BLOB), ordnet MFC so viel Platz wie nötig, um das BLOB zu holen. Wenn die Datasource gibt SQL_NO_TOTAL, darauf hinweist, dass es nicht die Größe des BLOBs, bestimmen kann erstellt MFC kleinere Blöcke. Die anfängliche Standardgröße beträgt 64K und nachfolgenden Blöcke werden doppelt so groß sein; Beispielsweise wird die zweite 128 K, die dritte ist 256 K, und So weiter. Die ursprüngliche Größe ist konfigurierbar.
Nicht bindend: Abrufen/Senden von Daten direkt von ODBC mit SQLGetData
Mit dieser Methode Sie vollständig die Datenbankklassen umgehen, und befassen sich mit der Spalte long-Daten selbst.
Vorteile:
Sie können Daten auf Datenträger bei Bedarf oder entscheiden, dynamisch wie viel Daten abrufen Zwischenspeichern.
Nachteile:
Sie erhalten nicht des Rahmens Bearbeiten oder AddNew unterstützt, und Sie müssen schreiben code selbst grundlegende Funktionen ausführen (Löschen funktioniert zwar, da es keine Spalte-Ebene-Betrieb).
In diesem Fall die Spalte long-Daten muss in der Auswahlliste des Recordsets werden, aber sollte nicht an das Framework gebunden werden. Eine Möglichkeit, dies zu tun ist liefern eigene SQL-Anweisung über GetDefaultSQL oder als LpszSQL Argument CRecordset- Open -Funktion und nicht die zusätzliche Spalte mit einem Funktionsaufruf RFX_ binden. ODBC erfordert die ungebundene Felder rechts neben der gebundenen Felder angezeigt werden, so fügen Sie Ihrer ungebundenen Spalten an das Ende der select-Liste.
Warnung&Nbsp; Da Ihre Spalte long-Daten nicht vom Framework gebunden ist, werden Änderungen nicht mit Aufrufen von CRecordset:: Update behandelt. Sie müssen erstellen und die erforderlichen SQL- INSERT und UPDATE -Anweisungen senden Sie sich selbst.
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie