Aracılığıyla paylaş


Kayıt Kümesi: Veri Sütunlarını Dinamik Olarak Bağlama (ODBC)

Bu konu MFC ODBC sınıfları için geçerlidir.

Kayıt kümeleri, tasarım zamanında belirttiğiniz bağlama tablosu sütunlarını yönetir, ancak tasarım zamanında sizin için bilinmeyen sütunları bağlamak isteyebileceğiniz durumlar vardır. Bu konu başlığı altında açıklanmaktadır:

Dekont

Bu konu, toplu satır getirmenin uygulanmadığı türetilen CRecordset nesneler için geçerlidir. Toplu satır getirme kullanıyorsanız genel olarak açıklanan teknikler önerilmez. Toplu satır getirme hakkında daha fazla bilgi için bkz . Kayıt Kümesi: Kayıtları Toplu Getirme (ODBC).

Sütunları dinamik olarak bağlayabileceğiniz durumlarda

Dekont

MFC ODBC Tüketici sihirbazı Visual Studio 2019 ve sonraki sürümlerde kullanılamaz. Yine de el ile tüketici oluşturabilirsiniz.

Tasarım zamanında, MFC Uygulama Sihirbazı veya MFC ODBC Tüketici Sihirbazı (Sınıf Ekle'den) veri kaynağınızdaki bilinen tablo ve sütunları temel alan kayıt kümesi sınıfları oluşturur. Veritabanları, bunları tasarlarken ve daha sonra uygulamanızın çalışma zamanında bu tablo ve sütunları kullanması arasında değişebilir. Siz veya başka bir kullanıcı, bir tablo ekleyebilir veya bırakabilir ya da uygulamanızın kayıt kümesinin bağlı olduğu bir tablodan sütun ekleyebilir veya bırakabilirsiniz. Bu, büyük olasılıkla tüm veri erişim uygulamaları için bir sorun değildir, ancak sizin içinse, yeniden tasarlama ve yeniden derleme dışında veritabanı şemasındaki değişikliklerle nasıl başa çıkabilirsiniz? Bu konunun amacı bu soruyu yanıtlamaktır.

Bu konu başlığında, sütunları dinamik olarak bağlayabileceğiniz en yaygın durum açıklanmaktadır. Bilinen bir veritabanı şemasını temel alan bir kayıt kümesiyle başladıktan sonra, çalışma zamanında ek sütunları işlemek istiyorsunuz. Diğer veri türlerini yönetmenize yardımcı olmak için CString öneriler sağlansa da, konu başlığında ek sütunların alan verisi üyeleriyle eşlendiği varsayılır.

Az miktarda ek kodla şunları yapabilirsiniz:

Kayıt kümeniz, tasarım zamanında tanıdığınız sütunların veri üyelerini içerir. Ayrıca, hedef tablonuza yeni sütun eklenip eklenmediğini dinamik olarak belirleyen ve ekleniyorsa bu yeni sütunları dinamik olarak ayrılmış depolamaya (kayıt kümesi veri üyeleri yerine) bağlayan az miktarda ek kod içerir.

Bu konu, bırakılan tablolar veya sütunlar gibi diğer dinamik bağlama durumlarını kapsamaz. Bu gibi durumlarda ODBC API çağrılarını daha doğrudan kullanmanız gerekir. Daha fazla bilgi için bkz . ODBC Programcı Başvurusu.

Sütunları Dinamik Olarak Bağlama

Sütunları dinamik olarak bağlamak için ek sütunların adlarını bilmeniz (veya belirleyebilmeniz) gerekir. Ayrıca ek alan veri üyeleri için depolama alanı ayırmanız, adlarını ve türlerini belirtmeniz ve eklediğiniz sütun sayısını belirtmeniz gerekir.

Aşağıdaki tartışmada iki farklı kayıt kümesinden bahsediliyor. Birincisi, hedef tablodan kayıtları seçen ana kayıt kümesidir. İkincisi, hedef tablonuzdaki sütunlar hakkında bilgi almak için kullanılan özel bir sütun kayıt kümesidir.

Genel İşlem

En genel düzeyde şu adımları izlersiniz:

  1. Ana kayıt kümesi nesnenizi oluşturma.

    İsteğe bağlı olarak, açık CDatabase bir nesneye bir işaretçi geçirin veya sütun kayıt kümesine başka bir şekilde bağlantı bilgileri sağlayabilmek.

  2. Dinamik olarak sütun ekleme adımlarını izleyin.

    Aşağıdaki Sütunları Ekleme bölümünde açıklanan işleme bakın.

  3. Ana kayıt kümenizi açın.

    Kayıt kümesi kayıtları seçer ve kayıt alanı değişimini (RFX) kullanarak hem statik sütunları (kayıt kümesi alan veri üyelerine eşlenenler) hem de dinamik sütunları (ayırdığınız ek depolama alanına eşlenir) bağlar.

Sütunları Ekleme

Çalışma zamanında eklenen sütunları dinamik olarak bağlamak için aşağıdaki adımlar gerekir:

  1. Çalışma zamanında hedef tabloda hangi sütunların olduğunu belirleyin. Bu bilgiden, kayıt kümesi sınıfınız tasarlandıktan sonra tabloya eklenmiş olan sütunların listesini ayıklayın.

    İyi bir yaklaşım, hedef tablonun (sütun adı ve veri türü gibi) sütun bilgileri için veri kaynağını sorgulamak üzere tasarlanmış bir sütun kayıt kümesi sınıfı kullanmaktır.

  2. Yeni alan veri üyeleri için depolama alanı sağlayın. Ana kayıt kümesi sınıfınızda bilinmeyen sütunlar için alan veri üyeleri olmadığından, adları, sonuç değerlerini ve büyük olasılıkla veri türü bilgilerini depolamak için bir yer sağlamanız gerekir (sütunlar farklı veri türleriyse).

    Bir yaklaşım, biri yeni sütunların adları, diğeri sonuç değerleri ve üçüncüsü de veri türleri (gerekirse) için olmak üzere bir veya daha fazla dinamik liste oluşturmaktır. Bu listeler, özellikle değer listesi, bağlama için gerekli bilgileri ve gerekli depolama alanını sağlar. Aşağıdaki şekilde listelerin oluşturulması gösterilmektedir.

    Building lists of columns to bind dynamically.
    Dinamik Olarak Bağlanacak Sütun Listeleri Oluşturma

  3. Eklenen her sütun için ana kayıt kümenizin DoFieldExchange işlevine bir RFX işlev çağrısı ekleyin. Bu RFX çağrıları, ek sütunlar da dahil olmak üzere bir kaydı getirme ve sütunları kayıt kümesi veri üyelerine veya bunlar için dinamik olarak sağlanan depolama alanına bağlama işini yapar.

    Bir yaklaşım, ana kayıt kümenizin DoFieldExchange işlevine yeni sütunlar listenizde döngü yapan ve listedeki her sütun için uygun RFX işlevini çağıran bir döngü eklemektir. Her RFX çağrısında, sütun adı listesinden bir sütun adı ve sonuç değeri listesinin ilgili üyesinde bir depolama konumu geçirin.

Sütun Listeleri

Birlikte çalışmanız gereken dört liste aşağıdaki tabloda gösterilmiştir.

List Tanım
Geçerli Tablo Sütunları (Çizimde Liste 1) Veri kaynağındaki tabloda bulunan sütunların listesi. Bu liste, kayıt kümenizde şu anda bağlı olan sütunların listesiyle eşleşebilir.
Bound-Recordset-Columns (Çizimde Liste 2) Kayıt kümenizde ilişkili sütunların listesi. Bu sütunların işlevinizde DoFieldExchange zaten RFX deyimleri var.
Dinamik Olarak Bağlanacak Sütunlar (Çizimde Liste 3) Tablodaki sütunların listesidir ancak kayıt kümenizde yer almaz. Bunlar dinamik olarak bağlamak istediğiniz sütunlardır.
Dinamik-Sütun-Değerler (Çizimde liste 4) Dinamik olarak bağladığınız sütunlardan alınan değerler için depolama alanı içeren liste. Bu listenin öğeleri, Sütunlar arası-Bağlama-Dinamik olarak bire bir'deki öğelere karşılık gelir.

Listelerinizi Oluşturma

Genel bir stratejiyi göz önünde bulundurarak ayrıntılara dönebilirsiniz. Bu konunun geri kalanındaki yordamlar, Sütun Listelerinde gösterilen listeleri nasıl oluşturabileceğinizi gösterir. Yordamlar size şu yollarda yol gösterir:

  • Kayıt kümenizde bulunmayan sütunların adlarını belirleme.

  • Tabloya yeni eklenen sütunlar için dinamik depolama alanı sağlama.

  • Yeni sütunlar için RFX çağrılarını dinamik olarak ekleme.

Kayıt Kümenizde Hangi Tablo Sütunlarının Olmadığını Belirleme

Ana kayıt kümenizde zaten bağlı olan sütunların listesini içeren bir liste (çizimdeki Liste 2'de olduğu gibi Bound-Recordset-Columns) oluşturun. Ardından, veri kaynağındaki tabloda yer alan ancak ana kayıt kümenizde olmayan sütun adlarını içeren bir liste (Current-Table-Columns ve Bound-Recordset-Columns'dan türetilen Dinamik Olarak Sütunlar-Bağlama) oluşturun.

Kayıt kümesinde olmayan sütunların adlarını belirlemek için (Sütunlar Arası-Bağlama-Dinamik)
  1. Ana kayıt kümenizde zaten bağlı olan sütunların listesini (Bound-Recordset-Columns) oluşturun.

    Yaklaşımlardan biri, tasarım zamanında Bound-Recordset-Columns oluşturmaktır. Bu adları almak için kayıt kümesinin DoFieldExchange işlevindeki RFX işlev çağrılarını görsel olarak inceleyebilirsiniz. Ardından, listenizi adlarla başlatılan bir dizi olarak ayarlayın.

    Örneğin, çizimde üç öğe içeren Bound-Recordset-Columns (Liste 2) gösterilmektedir. Bound-Recordset-Columns dosyasında Current-Table-Columns (Liste 1) içinde gösterilen Telefon sütunu eksik.

  2. Ana kayıt kümenizde henüz bağlı olmayan sütunların listesini (Sütunlar-Bağlama-Dinamik) oluşturmak için Current-Table-Columns ve Bound-Recordset-Columns'ı karşılaştırın.

    Yaklaşımlardan biri, çalışma zamanında tablodaki sütun listenizde (Current-Table-Columns) ve zaten kayıt kümenizde (Bound-Recordset-Columns) bağlı olan sütun listenizde paralel olarak döngü yapmaktır. Sütunlara-Bağlama-Dinamik olarak, Current-Table-Columns içine Bound-Recordset-Columns içinde görünmeyen adları koyun.

    Örneğin, çizimde Tek öğe içeren Sütunlar-Bağlama Dinamik Olarak (Liste 3) gösterilmektedir: Current-Table-Columns'da (Liste 1) bulunan ancak İlişkili Kayıt Kümesi Sütunları'nda (Liste 2) bulunmayan Telefon sütunu.

  3. Dinamik olarak bağlamak için sütun listenizde depolanan her sütun adına karşılık gelen veri değerlerinin depolandığı Dinamik Sütun-Değerler listesini (çizimdeki Liste 4'te olduğu gibi) oluşturun (Sütunlar-Bağlama-Dinamik).

    Bu listenin öğeleri, yeni kayıt kümesi alanı veri üyelerinin rolünü oynar. Bunlar, dinamik sütunların bağlı olduğu depolama konumlarıdır. Listelerin açıklamaları için bkz . Sütun Listeleri.

Yeni Sütunlar için Depolama Sağlama

Ardından, dinamik olarak bağlanacak sütunlar için depolama konumları ayarlayın. Fikir, her sütunun değerinin depolandığı bir liste öğesi sağlamaktır. Bu depolama konumları, normalde bağlı sütunları depolayan kayıt kümesi üye değişkenlerine paraleldir.

Yeni sütunlar için dinamik depolama sağlamak için (Dinamik-Sütun-Değerler)

  1. Her sütundaki verilerin değerini içerecek şekilde Dinamik-Sütun-Değerler oluşturarak Sütunlar arası Bağlama-Dinamik olarak paralel hale getirebilirsiniz.

    Örneğin, çizimde bir öğe içeren Dinamik Sütun-Değerler (Liste 4) gösterilmektedir: geçerli kaydın gerçek telefon numarasını içeren bir CString nesne: "555-1212".

    En yaygın durumda, Dynamic-Column-Values türünde CStringöğelere sahiptir. Değişen veri türlerine sahip sütunlarla ilgileniyorsanız, çeşitli türlerdeki öğeleri içerebilen bir listeye ihtiyacınız vardır.

Yukarıdaki yordamların sonucu iki ana listedir: Sütunların adlarını dinamik olarak içeren Sütunlar-Bağlama ve geçerli kaydın sütunlarındaki değerleri içeren Dinamik-Sütun-Değerler.

Bahşiş

Yeni sütunların tümü aynı veri türünde değilse, sütun listesindeki ilgili her öğenin türünü bir şekilde tanımlayan öğeleri içeren ek bir paralel liste isteyebilirsiniz. (İsterseniz bunun için AFX_RFX_BOOL, AFX_RFX_BYTE vb. değerleri kullanabilirsiniz. Bu sabitler AFXDB.H.) içinde tanımlanır. Sütun veri türlerini nasıl temsil ettiğinize bağlı olarak bir liste türü seçin.

Sütunları Bağlamak için RFX Çağrıları Ekleme

Son olarak, işlevinizdeki DoFieldExchange yeni sütunlar için RFX çağrıları yerleştirerek dinamik bağlamanın gerçekleşmesini düzenleyin.

Yeni sütunlara yönelik RFX çağrılarını dinamik olarak eklemek için
  1. Ana kayıt kümenizin DoFieldExchange üye işlevinde, yeni sütun listenizde döngüye geçen kod ekleyin (Sütunlar arası-Bağlama-Dinamik). Her döngüde, Sütunlar arası Bağlama-Dinamik olarak bir sütun adı ve Dinamik-Sütun-Değerler'den sütun için bir sonuç değeri ayıklayın. Bu öğeleri sütunun veri türüne uygun bir RFX işlev çağrısına geçirin. Listelerin açıklamaları için bkz . Sütun Listeleri.

Yaygın durumda, işlevinizde RFX_Text aşağıdaki kod satırlarında olduğu gibi listelerden nesneleri ayıklarsınız CString ; burada Sütunlar-Bağlama-Dinamik olarak CStringList çağrılır m_listName ve Dynamic-Column-Values CStringList olarak adlandırılır m_listValue:

RFX_Text( pFX,
            m_listName.GetNext( posName ),
            m_listValue.GetNext( posValue ));

RFX işlevleri hakkında daha fazla bilgi için bkz. Sınıf Kitaplığı Başvurusu'nda Makrolar ve Geneller.

Bahşiş

Yeni sütunlar farklı veri türleriyse, her tür için uygun RFX işlevini çağırmak için döngünüzde bir switch deyimi kullanın.

Çerçeve, kayıt kümesine sütun bağlama işlemi sırasında Open çağırdığındaDoFieldExchange, statik sütunlar için RFX çağrıları bu sütunları bağlar. Ardından döngünüz dinamik sütunlar için RFX işlevlerini tekrar tekrar çağırır.

Ayrıca bkz.

Kayıt Kümesi (ODBC)
Kayıt kümesi: Büyük Veri Öğeleri ile Çalışma (ODBC)