Aracılığıyla paylaş


SQL: Kayıt Kümenizin SQL Deyimini Özelleştirme (ODBC)

Bu konu şunları açıklar:

  • Çerçeve bir SQL deyimini nasıl oluşturur

  • SQL Deyimi nasıl geçersiz kılınır

[!NOT]

Bu bilgi MFC ODBC sınıfları için geçerlidir.MFC DAO sınıfları ile çalışıyorsanız, DAO Yardım'daki "Microsoft Jet Veritabanı Altyapısı SQL ve ANSI SQL'in Karşılaştırılması" konusuna bakın.

SQL Deyimi Oluşturma

Kayıt kümeniz bir SQL SELECT deyimindeki öncelikli kayıt seçimini temel alır.Sınıfınızı bir sihirbazla bildirdiğinizde, GetDefaultSQL üye işlevinin şöyle görünen baskın bir sürümünü yazar ( CAuthorsadında bir kayıt kümesi sınıfı için).

CString CAuthors::GetDefaultSQL()
{
    return "AUTHORS";
}

Varsayılan olarak, bu geçersiz kılma, sihirbaz ile belirlediğiniz tablo adını getirir.Örnekte, tablo adı "YAZARLAR."'dır. Daha sonra kayıt kümesinin Open üye işlevini çağırdığınızda, Open öğesi formun son SELECT deyimini oluşturur:

SELECT rfx-field-list FROM table-name [WHERE m_strFilter] 
       [ORDER BY m_strSort]

table-name elde edildiğinde GetDefaultSQL arayarak ve rfx-field-listDoFieldExchangeRFX işlev aramaların arayarak Varsayılan ifadeyi parametreler veya bir filtreyle değiştirebilseniz bile, eğer çalışma zamanında geçersiz kılan bir versiyonla değiştirmediyseniz SELECT ifadesi için bu sonucu alırsınız.

[!NOT]

Boşluk içeren (veya içerebilir) sütun adı belirtirseniz, adı köşeli ayraçlar içine almalısınız.Örneğin, "Ad" adı "[Ad]" olmalıdır.

Varsayılan SEÇ ifadesini geçersiz kılmak için öğesini çağırdığınızda bütün bir SEÇ ifadesi içeren bir dize geçirin.Kayıt kümesi kendi varsayılan dizesini oluşturmak yerine, sağladığınız dizeyi kullanır.Değiştirme deyiminiz bir WHERE yan tümcesi içeriyorsa, iki filtre deyimi olacağından m_strFilter öğesine filtre belirtmeyin.Benzer şekilde, değiştirme deyiminiz bir ORDER BY yan tümcesi içeriyorsa lause, iki tane sıralama deyimine sahip olmamak için m_strSort içinde bir sıralama belirtmeyin.

[!NOT]

Filtrelerinizde harflerden oluşan dizeler (veya SQL deyiminin diğer bölümleri) kullanıyorsanız, bunlar gibi dizeleri DBMS'ye özgü harflerden oluşan değişmez ön ek ve son ek karakteri (veya karakterleri) ile "alıntı" yapmanız (belirtilmiş ayırıcılar içine almanız) gerekebilir.

DBMS'ye bağlı olarak dış birleşimler gibi işlemler için özel sözdizimsel gereksinimlerle de karşılaşabilirsiniz.DBMS için sürücünüzden bu bilgiyi almak için ODBC işlevleri kullanın.Örneğin, LITERAL_PREFIX ve LITERAL_SUFFIX karakterlerini istemek için, SQL_VARCHAR gibi belirli bir veri türü için, ::SQLGetTypeInfo çağırın.Veritabanı bağımsız kod yazıyorsanız, ayrıntılı sözdizimi bilgi için MSDN Kitaplığı CD'sindeki ODBC SDKProgramcının Başvurusu Ek C'ye bakın.

Kayıt kümesi nesnesi, özel bir SQL deyimi geçirmediğiniz sürece kayıtları seçmek için kullandığı SQL deyimini oluşturur.Bunun nasıl yapıldığı genellikle lpszSQL parametresi içindeki üye işlevine geçirdiğiniz değere bağlıdır.

Bir SQL SEÇ deyiminin genel biçimi şöyledir:

SELECT [ALL | DISTINCT] column-list FROM table-list
    [WHERE search-condition][ORDER BY column-list [ASC | DESC]]

DISTINCT anahtar kelimesini kayıt kümenizin SQL ifadesine eklemenin bir yolu da anahtar kelimeyi DoFieldExchange içindeki ilk RFX işlevi çağrısına katıştırmaktır.Örne?in:

...
    RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...

[!NOT]

Bu tekniği yalnızca salt okunur olarak açılmış bir kayıt kümesiyle kullanın.

SQL deyimini geçersiz kılın

Aşağıdaki tablo lpszSQL parametresi için olasılıklarını gösterir.Tablodaki bu alanlar aşağıdaki tabloda açıklanmıştır.

LpszSQL parametresi ve Sonuç SQL dizesi

Durum

lpszSQL'de ne geçirmelisiniz

Elde edilen SELECT deyimi

1

NULL

SELECTrfx-field-listFROMtable-name

Tablo adını almak içinCRecordset::Opençağırır GetDefaultSQL.GetDefaultSQL öğesinin neyi döndürdüğüne bağlı olarak sonuç dizesi 2'den 5'e kadar olan durumlardan birine karşılık gelir.

2

Bir tablo adı

SELECTrfx-field-listFROMtable-name

Alan listesi DoFieldExchange öğesindeki RFX deyimlerinden alınır.m_strFilter ve m_strSort boş değilse, WHERE ve/veya ORDER BY yan tümcelerini ekler.

3 *

WHERE veya ORDER BY yan tümcesi olmayan tam bir SELECT deyimi

Geçti olarak.m_strFilter ve m_strSort boş değilse, WHERE ve/veya ORDER BY yan tümcelerini ekler.

4 *

WHERE ve/veya ORDER BY yan tümcesi olan tam bir SELECT deyimi

Geçti olarak.m_strFilter ve/veya m_strSort boş kalmalıdır veya iki filtre ve/veya sıralama ifadesi oluşturulmalıdır.

5 *

Saklı yordama yapılan bir çağrı

Geçti olarak.

* m_nFields, SEÇ deyiminde belirtilen sütun sayısına eşit veya daha az olmalıdır.SEÇ deyiminde belirtilen her sütunun veri türü ilgili RFX çıktı sütununun veri türü ile aynı olmalıdır.

6hs301kk.collapse_all(tr-tr,VS.110).gifCase 1 lpszSQL = null

Kayıt seçimi GetDefaultSQL öğesinin CRecordset::Open öğesini çağırdığında ne gönderdiğine dayanır.2 ile 5 arasındaki örnekler, olası dizeleri açıklar.

6hs301kk.collapse_all(tr-tr,VS.110).gifDurum 2 lpszSQL = bir tablo adı

Kayıt kümesi DoFieldExchange öğesinin kayıt kümesi sınıfından çağrılan RFX işlevinden sağlanan sütun adlarından sütun listesini oluşturmak için kayıt alanı değişimini (RFX) kullanır.Kayıt kümesi sınıfınızı bildirmek için sihirbaz kullandıysanız, bu durum (sihirbazda belirttiğiniz aynı tablo adının geçmesi koşuluyla) durum 1 ile aynı sonucu verir.Sınıfınızı yazmak için sihirbaz kullanmazsanız, durum 2 SQL ifadesi oluşturmak için en basit yoldur.

Aşağıdaki örnek bir MFC veritabanı uygulamasından kayıtlar seçen SQL anlatımı oluşturur.Framework GetDefaultSQL üye işlevini çağırdığında işlev tablonun adını döndürür, SECTION.

CString CEnrollSet::GetDefaultSQL()
{
    return "SECTION";
}

SQL SELECT ifadesi için sütunların adını elde etmek için çatı DoFieldExchange üye işlevini çağırır.

void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, "CourseID", m_strCourseID);
    RFX_Text(pFX, "InstructorID", m_strInstructorID);
    RFX_Text(pFX, "RoomNo", m_strRoomNo);
    RFX_Text(pFX, "Schedule", m_strSchedule);
    RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

Tamamlandığında SQL deyimi aşağıdaki gibi görünür:

SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo 
    FROM SECTION

6hs301kk.collapse_all(tr-tr,VS.110).gifDurum 3 lpszSQL = bir select / from deyimi

RFX'in otomatik olarak oluşturmasına güvenmek yerine el işe sütun listesini belirtin.Bunu, şu durumda yapmak isteyebilirsiniz:

  • DISTINCT anahtarını ardından SELECT anahtarını belirlemeyi istediğinizde.

    Sütun listeniz DoFieldExchange içinde listelendiği gibi aynı sıradaki tür ve sütun adları ile eşleşmeli.

  • Sütunları sizin için bağlaması ve alması için RFX'e güvenmek yerine**:: SQLGetData** ODBC işlevini kullanarak sütun değerlerini el ile almak için bir nedeniniz var.

    Örneğin, uygulama dağıtıldıktan sonra uygulamanızın bir müşterisinin veritabanı tablolarına eklediği yeni sütunları yerleştirmek isteyebilirsiniz.Sınıfı bir sihirbazla beyan ettiğiniz sırada bilinmeyen bu fazladan alan verisi üyelerini eklemeniz gerekir.

    Sütun listeniz, el ile ilişkili sütun adlarını takip eden DoFieldExchange içinde listelendiği gibi aynı sıradaki tür ve sütun adları ile eşleşmeli.Daha fazla bilgi için bkz. Kayıt Kümesi: Veri Sütunlarını Dinamik Olarak Bağlama (ODBC).

  • FROM tümcesindeki birden fazla tabloyu belirleyerek tabloları birleştirmeyi isteyin.

    Bilgi ve bir örnek için bkz. Kayıt Kümesi: Birleşim Gerçekleştirme (ODBC).

6hs301kk.collapse_all(tr-tr,VS.110).gifDurum 4 lpszSQL = select / from + where ve/veya order by

Her şeyi belirtin: sütun listesi (DoFieldExchange içinde RFX aramalarına bağlı), tablo listesi ve WHERE ve/veya bir ORDER BY yan tümcesinin içeriğini.WHERE ve/veya ORDER BY yan tümcelerinizi bu şekilde belirtirseniz m_strFilter ve/veya m_strSort öğelerini kullanmayın.

6hs301kk.collapse_all(tr-tr,VS.110).gifBüyük/küçük harf 5 lpszSQL = bir saklı yordam çağrısı

Önceden tanımlanmış bir sorguyu çağırmanız gerekiyorsa (Microsoft SQL Sunucu veritabanında saklanan bir yordam gibi) lpszSQL öğesine geçireceğiniz dizeye bir CALL deyimi yazmanız gerekir.Sihirbazlar, önceden tanımlanmış bir sorguyu çağırmak için bir kayıt kümesi sınıfına ilişkin bildirimi desteklemez.Önceden tanımlanmış tüm sorgular kayıtları döndürmez.

Önceden tanımlanmış bir sorgu kayıtları döndürmezse, CDatabase üye işlevini ExecuteSQL doğrudan kullanabilirsiniz.Kayıtları döndüren önceden tanımlanmış bir sorgu için, yordamın döndürdüğü her sütun için DoFieldExchange içindeki RFX çağrılarını el ile de yazmanız gerekir.Önceden tanımlı sorgu olarak RFX çağrıları aynı sırada olmalıdır ve aynı türleri döndürmelidir.Daha fazla bilgi için bkz. Kayıt Kümesi: Önceden Tanımlanmış Sorgu için Sınıf Bildirme (ODBC).

Ayrıca bkz.

Kavramlar

SQL: SQL ve C++ Veri Türleri (ODBC)

SQL: Doğrudan SQL Çağrıları Yapma (ODBC)