Kayıt Kümesi: Önceden Tanımlanmış Sorgu için Bir Sınıf Bildirme (ODBC)

Not

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

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

Bu konuda, önceden tanımlanmış bir sorgu için kayıt kümesi sınıfının nasıl oluşturulacağı açıklanmaktadır (microsoft SQL Server'da olduğu gibi bazen saklı yordam olarak da adlandırılır).

Not

CRecordset'den türetilmiş ve toplu satır getirmenin uygulanmadığı nesneler için bu konu geçerlidir. Toplu satır getirme uygulanırsa, işlem çok benzerdir. Toplu satır getirme uygulayan kayıt kümeleri ile olmayan kayıt kümeleri arasındaki farkları anlamak için bkz . Kayıt Kümesi: Kayıtları Toplu Olarak Getirme (ODBC).

Bazı veritabanı yönetim sistemleri (DBMS) önceden tanımlanmış bir sorgu oluşturmanıza ve bunu programlarınızdan işlev gibi çağırmanıza olanak tanır. Sorgunun bir adı vardır, parametreler alabilir ve kayıtları döndürebilir. Bu konudaki yordam, kayıtları döndüren (ve belki de parametreleri alan) önceden tanımlanmış bir sorgunun nasıl çağrıldığını açıklar.

Veritabanı sınıfları önceden tanımlanmış sorguların güncelleştirilmesini desteklemez. Önceden tanımlanmış anlık görüntü sorgusu ile dinamik küme önceden tanımlanmış sorgu arasındaki fark güncelleştirilebilirlik değildir, ancak diğer kullanıcılar (veya programınızdaki diğer kayıt kümeleri) tarafından yapılan değişikliklerin kayıt kümenizde görünür olup olmadığıdır.

İpucu

Kayıtları döndürmeyen önceden tanımlanmış bir sorguyu çağırmak için kayıt kümesine ihtiyacınız yoktur. Aşağıda açıklandığı gibi SQL deyimini hazırlayın, ancak CDatabase ExecuteSQL üyesi işlevini çağırarak yürütün.

Önceden tanımlanmış bir sorguyu çağırmayı yönetmek için tek bir kayıt kümesi sınıfı oluşturabilirsiniz, ancak işin bir bölümünü kendiniz yapmanız gerekir. Sihirbazlar, bu amaçla özel olarak bir sınıf oluşturmayı desteklemez.

Önceden tanımlanmış sorguyu çağırmak için bir sınıf oluşturmak için (saklı yordam)

  1. Sorgu tarafından döndürülen en fazla sütunu içeren tablo için bir kayıt kümesi sınıfı oluşturmak üzere MFC ODBC Tüketici Sihirbazı'nı Sınıf Ekle'den kullanın. Bu size bir başlangıç verir.

  2. Sorgunun döndürdüğü ancak sihirbaz tarafından oluşturulmayan herhangi bir tablonun sütunları için alan veri üyelerini elle ekleyin.

    Örneğin, sorgu iki ek tablodan her biri üç sütun döndürürse, sınıfa altı alan veri üyesi (uygun veri türlerinden) ekleyin.

  3. Sınıfın DoFieldExchange üye işlevine RFX fonksiyon çağrılarını el ile ekleyin ve eklenen her alan veri üyesinin veri türüne karşılık gelen bir çağrı olmalıdır.

    Immediately before these RFX calls, call <MSHelp:link keywords="_mfc_CFieldExchange.3a3a.SetFieldType" TABINDEX="0">SetFieldType</MSHelp:link>, as shown here:
    pFX->SetFieldType( CFieldExchange::outputColumn );
    

    Not

    Sonuç kümesinde döndürülen veri türlerini ve sütunların sırasını bilmeniz gerekir. içindeki RFX işlev çağrılarının DoFieldExchange sırası, sonuç kümesi sütunlarının sırasıyla eşleşmelidir.

  4. Kayıt kümesi sınıf yapıcısında yeni alan veri üyelerinin başlatmalarını el ile ekleyin.

    Ayrıca m_nFields veri üyesi için başlatma değerini artırmanız gerekir. Sihirbaz başlatma işlemini yazar, ancak yalnızca sizin için eklediği alan veri üyelerini kapsar. Örneğin:

    m_nFields += 6;
    

    Bazı veri türleri, örneğin CLongBinary burada veya bayt dizilerinde başlatılmamalıdır.

  5. Sorgu parametreleri alıyorsa, her parametre için bir parametre veri üyesi, her biri için bir RFX işlev çağrısı ve her biri için bir başlatma ekleyin.

  6. Bu yordamın 4. adımındaki eklenen alanlar için yaptığınız gibi, eklenen her parametre için m_nParams artırmanız gerekir. Daha fazla bilgi için bkz . Kayıt Kümesi: Kayıt Kümesini Parametreleştirme (ODBC).

  7. Aşağıdaki forma sahip bir SQL deyimi dizesini el ile yazın:

    {CALL proc-name [(? [, ?]...)]}
    

    burada CALL bir ODBC anahtar sözcüğüdür, proc-name veri kaynağında bilindiği gibi sorgunun adıdır ve "?" öğeleri çalışma zamanında kayıt kümesine sağladığınız parametre değerlerinin yer tutucularıdır (varsa). Aşağıdaki örnek, bir parametre için bir yer tutucu hazırlar:

    CString mySQL = "{CALL Delinquent_Accts (?)}";
    
  8. Kayıt kümesini açan kodda, kayıt kümesinin parametre veri üyelerinin değerlerini ayarlayın ve SQL dizenizi OpenlpszSQL parametresi olarak geçirerek üye işlevini çağırın. Bunun yerine sınıfınızdaki üye işlevinin döndürdüğü dizeyi GetDefaultSQL değiştirin.

Aşağıdaki örneklerde, satış bölgesi numarası için bir parametre alan adlı Delinquent_Acctsönceden tanımlanmış bir sorguyu çağırma yordamı gösterilmektedir. Bu sorgu üç sütun döndürür: Acct_No, L_Name, Phone. Tüm sütunlar Müşteriler tablosundandır.

Aşağıdaki kayıt kümesi, sorgunun döndürdüğü sütunlar için alan veri üyelerini ve çalışma zamanında istenen satış bölgesi numarası için bir parametre belirtir.

class CDelinquents : public CRecordset
{
// Field/Param Data
    LONG m_lAcct_No;
    CString m_strL_Name;
    CString m_strPhone;
    LONG m_lDistParam;
    // ...
};

Bu sınıf bildirimi, sihirbaz tarafından yazıldığı şekliyledir; yalnızca m_lDistParam üyesi el ile eklenmiştir. Diğer üyeler burada gösterilmez.

Sonraki örnek, CDelinquents kurucusundaki veri üyeleri için başlatmaları gösterir.

CDelinquents::CDelinquents(CDatabase* pdb)
   : CRecordset(pdb)
{
    // Wizard-generated params:
    m_lAcct_No = 0;
    m_strL_Name = "";
    m_strPhone = "";
    m_nFields = 3;
    // User-defined params:
    m_nParams = 1;
    m_lDistParam = 0;
}

m_nFields ve m_nParams için başlatmaları not edin. Sihirbaz m_nFields başlatır; siz m_nParams başlatırsınız.

Sonraki örnekte içindeki CDelinquents::DoFieldExchangeRFX işlevleri gösterilir:

void CDelinquents::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, "Acct_No", m_lAcct_No);
    RFX_Text(pFX, "L_Name", m_strL_Name);
    RFX_Text(pFX, "Phone", m_strPhone);
    pFX->SetFieldType(CFieldExchange::param);
    RFX_Long(pFX, "Dist_No", m_lDistParam);
}

Döndürülen üç sütun için RFX çağrıları yapmanın yanı sıra, bu kod çalışma zamanında geçilen parametreyi bağlar. Parametre Dist_No (bölge numarası) sütununa bağlanır.

Sonraki örnekte SQL dizesinin nasıl ayarlanacağı ve kayıt kümesini açmak için nasıl kullanılacağı gösterilmektedir.

// Construct a CDelinquents recordset object
CDelinquents rsDel( NULL );
CString strSQL = "{CALL Delinquent_Accts (?)}"
// Specify a parameter value (obtained earlier from the user)
rsDel.m_lDistParam = lDistrict;
// Open the recordset and run the query
if( rsDel.Open( CRecordset::snapshot, strSQL ) )
    // Use the recordset ...

Bu kod bir anlık görüntü oluşturur, kullanıcıdan daha önce alınan bir parametreyi geçirir ve önceden tanımlanmış sorguyu çağırır. Sorgu çalıştırıldığında, belirtilen satış bölgesinin kayıtlarını döndürür. Her kayıt hesap numarası, müşterinin soyadı ve müşterinin telefon numarası için sütunlar içerir.

İpucu

Saklı yordamdan bir dönüş değeri (çıkış parametresi) işlemek isteyebilirsiniz. Daha fazla bilgi ve örnek için bkz . CFieldExchange::SetFieldType.

Ayrıca bkz.

Kayıt Kümesi (ODBC)
Kayıt kümesi: Bir Kayıt Kümesinde Yeniden Sorgulama (ODBC)
Kayıt Kümesi: Tablo için Sınıf Bildirme (ODBC)
Recordset: Birleştirme Yapma (ODBC)