TN045: mfc/veritabanı desteği için uzun Varchar/Varbinary

Bu not almak ve göndermek mfc veritabanı sınıflarını kullanarak odbc sql_longvarchar ve SQL_LONGVARBINARY veri türlerini açıklar.

Uzun Varchar/Varbinary bakış desteği

(Burada uzun veri sütunları anılacaktır) odbc sql_long_varchar ve SQL_LONGBINARY veri türleri, çok büyük miktarda veri tutabilir. Bu verileri işlemek 3 yol vardır:

Uzun veri sütunu, sorgu parametreleri için desteklenmez. Onlar sadece outputColumns için desteklenir.

Uzun veri sütunu için bir CString/CByteArray bağlama

Avantajları:

Bu yaklaşımı anlamak için basit ve bildik sınıfları ile çalışır. Çerçeve CString DDX_Textile CFormView desteği sağlar. Sen-si olmak çok sayıda genel dize veya toplama işlevlerini CString ve CByteArray sınıfları ve yerel veri değeri tutmak için ayrılan bellek miktarını denetleyebilirsiniz. Edit veya AddNew işlev çağrısı sırasında çerçeve alanı verilerini eski bir kopyasını tutar ve çerçeve otomatik olarak veri sizin için algılayabilir.

&Notnbsp;CString için çalışan ikili verileri karakter verileri ve CByteArray üzerinde çalışmak için tasarlandığından, CByteArray CStringkarakter verileri (sql_longvarchar) ve ikili veri (SQL_LONGVARBINARY) koymak önerilir.

Rfx işlevleri CString ve CByteArray veri sütunu için alınan değeri tutmak için ayrılan bellek varsayılan boyutu geçersiz olanak veren ek bir bağımsız değişken var. Not nMaxLength bağımsız değişkeninde aşağıdaki işlev bildirimleri:

 void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
 nbsp;  CString & değeri, int nMaxLength = 255, int nColumnType =
    SQL_VARCHAR);

void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255)

Uzun veri sütunu CString ya da CByteArrayiçine almak, en fazla veri miktarını, varsayılan olarak, 255 bayt döndürülür. Bunun ötesinde bir şey yok sayılır. Bu durumda, çerçeve, afx_sql_error_data_truncatedözel durum oluşturur. Neyse ki, açıkça nMaxLength MAXINT kadar büyük değerlere artırabilir.

ClassWizard sql_longvarchar CStringya da bir CByteArray için SQL_LONGVARBINARY için bağlayacaksınız. Uzun veri sütunu içine aldığınız 255 bayttan fazla ayırmak istiyorsanız, sonra nMaxLength için açıkça bir değer sağlayabilir.

Uzun veri sütunu için bir CString ya da CByteArraybağlı olduğu zaman, ne zaman o bir sql_varchar veya sql_VARBINARYbağlı olarak aynı alanı güncelleştirme çalışır. Düzenlemesırasında veri değeri uzak önbelleğe alınmış ve daha sonra güncelleştirme veri değeri değişiklikleri algılayıp kirli ve Null değerleri sütun için ayarladığınızdan çağrıldığında karşılaştırıldığında.

Uzun veri sütunu için bir CLongBinary bağlama

Uzun veri sütunu daha fazla MAXINT bayt veri içerebilir, muhtemelen bir CLongBinary almak düşünmelisiniz.

Avantajları:

Bu bir bütün uzun veri sütunu - e kadar kullanılabilir bellek alır.

Dezavantajları:

Verileri bellekte tutulur. Bu yaklaşım da çok büyük miktarda veri prohibitively pahalı. SetFieldDirty alan bir güncelleştirme işlemi dahil sağlamak ilişkili veri üyesi için çağırmanız gerekir.

Uzun veri sütunu bir CLongBinaryalmak, veritabanı sınıflarını uzun veri sütunu toplam boyutunu kontrol sonra tüm veri değerini tutacak büyüklükte bir hglobal bellek bölütü tahsis. Veritabanı sınıflarını, sonra tüm veri değerini ayrılan hglobal almak.

Veri kaynağı uzun veri sütunu beklenen boyutu döndüremez, çerçeve afx_sql_error_sql_no_totalözel durum oluşturur. hglobal ayırma denemesi başarısız olursa, bir standart bellek istisnası atılır.

ClassWizard bir sql_longvarchar veya SQL_LONGVARBINARY için CLongBinary sizin için bağlayacaksınız. CLongBinary üye değişken Ekle iletişim kutusunda değişken tipini seçin. ClassWizard sonra DoFieldExchange arama RFX_LongBinary bir çağrı ekleyin ve ilişkili alanların toplam sayısı arttırma.

Uzun veri sütunu değerleri güncelleştirmek için öncelikle tahsis edilen hglobal arayarak yeni veri tutacak büyüklükte emin :: GlobalSize CLongBinary m_hData üyesi üzerinde. Çok küçük hglobal bırakın ve bir uygun boyuta tahsis etmek. Yeni boyutu yansıtacak şekilde m_dwDataLength ayarla.

Aksi takdirde, m_dwDataLength eski yerine koymak veri boyutundan daha büyükse, size ücretsiz ve hglobaltahsis veya ayrılan bırakın. Aslında m_dwDataLength ' de kullanılan bayt sayısını belirtmek emin olun.

Nasıl güncelleme bir CLongBinary çalışır

CLongBinary güncelleştirme nasıl çalıştığını anlamak için gerekli değildir, ancak uzun veri değerleri bir veri kaynağına gönderme konusunda örnek olarak yararlı olabilir aşağıda açıklanan bu üçüncü yöntemi seçerseniz.

&Notnbsp;  Sırayla bir güncelleştirmeye dahil edilecek bir CLongBinary alanı, alan için açıkça SetFieldDirty çağırmalısınız. Bir alanı Null ayarlama dahil, herhangi bir değişiklik yaparsanız SetFieldDirty çağırmalısınız.

CLongBinary alan güncelleştirilirken veritabanı sınıflarını ODBC'ın data_at_exec mekanizması kullanın ( SQLSetPos' ın rgbValue argümanda odbc belgelerine bakın). Zaman çerçevesi ekleme hazırlar veya update deyimi, verileri, CLongBinary adresini içeren hglobal için işaret yerine yerine değer sütun olarak ayarlanır ve uzunluğu göstergesi sql_data_at_execiçin ayarlayın. Daha sonra güncelleştirme deyimini veri kaynağına gönderildiğinde, SQLExecDirect sırasında veri sql_need_datadöndürür. Bu çerçeve param bu sütun için değeri aslında bir CLongBinaryadresi olduğunu uyarır. Çerçeve SQLGetData ile bir küçük tampon gerçek uzunluğunu döndürmek için sürücü bekleniyor, bir kez çağırır. Sürücü büyük ikili nesne (blob) gerçek uzunluğunu döndürür, mfc BLOB'u almak için gereken alanı reallocates. sql_no_totalblob boyutu belirlenemiyor gösteren, datasource döner mfc küçük taşları oluşturacaktır. Varsayılan başlangıç boyutu 64 K'dır ve sonraki blok çift boyutu olacaktır; Örneğin, ikinci 128 k, üçüncü 256 k ve böyle devam eder. Başlangıç boyutu konfigüre edilebilir.

Bağlayıcı değil: Alma/veri doğrudan doğruya--dan odbc SQLGetData ile gönderme

Bu yöntem tamamen veritabanı sınıflarını atlama ve uzun veri sütunu kendiniz uğraşmak.

Avantajları:

Gerekirse disk ya da dinamik olarak ne kadar veri almak için karar veri önbelleğe alabilir.

Dezavantajları:

Çerçeve'nın Edit veya AddNew destek alamadım ve yazmak gerekir kendiniz (silme iş olsa da, bir sütun düzeyinde işlem olmadığından) temel işlevleri gerçekleştirmek için kod.

Bu durumda uzun veri sütunu Recordset seçme listesinde olması gerekir, ancak çerçeve tarafından bağlı değil. Bunu yapmanın bir yolu, kendi sql deyimi ile GetDefaultSQL ya da CRecordset' ın Open işlevi lpszSQL bağımsız değişken olarak tedarik ve fazladan sütun rfx_ işlevi çağrısı ile değil bağlamak etmektir. İlişkisiz alanlar ilişkili alanları sağında görünür odbc gerektirir, yani, ilişkisiz sütunları seçme listesinde sonuna ekleyin.

Uyarınbsp;  Uzun veri sütunu çerçeve tarafından bağlı değil çünkü, yapılan değişikliklerin CRecordset::Update çağrıları ele değil. Oluşturmalı ve gerekli sql I&NSERT ve update deyimleri kendinize gönderin.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index