Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu açıklar:
Çerçeve sql deyimini nasıl oluşturur?
SQL deyimini geçersiz kılma
Not
Bu bilgiler MFC ODBC sınıfları için geçerlidir. MFC DAO sınıfları ile çalışıyorsanız DAO Yardımı'ndaki "Microsoft Jet Veritabanı Altyapısı SQL ve ANSI SQL Karşılaştırması" konusuna bakın.
SQL Deyimi Oluşturma
Kayıt kümeniz, kayıt seçimini öncelikli olarak bir SQL SELECT deyimine dayandırıyor. Sınıfınızı bir sihirbazla bildirdiğinizde, üye işlevinin GetDefaultSQL şuna benzeyen geçersiz kılınan bir sürümünü yazar (adlı CAuthorskayıt kümesi sınıfı için).
CString CAuthors::GetDefaultSQL()
{
return "AUTHORS";
}
Varsayılan olarak, bu geçersiz kılma, sihirbaz ile belirttiğiniz tablo adını döndürür. Örnekte, tablo adı "YAZARLAR"dır. Daha sonra kayıt kümesinin Open üye işlevini çağırdığınızda, Open formun son SELECT deyimini oluşturur:
SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
[ORDER BY m_strSort]
burada table-name çağrılarak GetDefaultSQL elde edilir ve rfx-field-list içindeki DoFieldExchangeRFX işlev çağrılarından elde edilir. Varsayılan deyimi parametreler veya bir filtre ile değiştirebilmenize rağmen, bir SELECT deyimini çalışma zamanında bir üst sürümle değiştirmezseniz, bu bir SELECT deyimi için elde ettiğiniz şeydir.
Not
Boşluk içeren (veya içerebilen) bir sütun adı belirtirseniz, adı köşeli ayraç içine almanız gerekir. Örneğin, "Ad" adı "[Ad]" olmalıdır.
Varsayılan SELECT deyimini geçersiz kılmak için, Open öğesini çağırdığınızda, tam bir SELECT deyimi 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, m_strFilter içinde bir filtre belirtmeyin çünkü bu durumda iki filtre deyiminiz olur. Benzer şekilde, değiştirme ifadeniz bir ORDER BY yan tümcesi içeriyorsa, iki sıralama deyiminiz olmaması için m_strSort içinde bir sıralama belirtmeyin.
Not
Filtrelerinizde (veya SQL deyiminin diğer bölümlerinde) değişmez değer dizeleri kullanıyorsanız, DBMS'ye özgü değişmez değer ön eki ve değişmez değer sonek karakteri (veya karakterler) ile bu tür dizeleri "alıntılamanız" (belirtilen sınırlayıcıları içine almanız) gerekebilir.
DBMS'nize bağlı olarak dış birleşimler gibi işlemler için özel söz dizimsel gereksinimlerle de karşılaşabilirsiniz. DBMS için sürücünüzden bu bilgileri almak için ODBC işlevlerini kullanın. Örneğin, LITERAL_PREFIX ve LITERAL_SUFFIX karakterlerini istemek için ::SQLGetTypeInfo gibi belirli bir veri türünü çağırın SQL_VARCHAR. Veritabanından bağımsız kod yazıyorsanız ayrıntılı söz dizimi bilgileri için ODBC Programcı Başvurusu'nda Ek C: SQL Dil Bilgisi bölümüne 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ığı, esas olarak üye işlevinin lpszSQL parametresinde geçirdiğiniz değere Open bağlıdır.
SQL SELECT deyiminin genel biçimi:
SELECT [ALL | DISTINCT] column-list FROM table-list
[WHERE search-condition][ORDER BY column-list [ASC | DESC]]
DISTINCT anahtar sözcüğünü kayıt kümenizin SQL deyiminize eklemenin bir yolu, içindeki ilk RFX işlev çağrısına anahtar sözcüğünü yerleştirmektir. Örneğin:
...
RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...
Not
Bu tekniği yalnızca salt okunur olarak açılan bir kayıt kümesiyle kullanın.
SQL Deyimini Geçersiz Kılma
Aşağıdaki tabloda Open için lpszSQL parametresinin olasılıkları gösterilmektedir. Tablodaki vakalar, tabloyu takiben açıklanmıştır.
lpszSQL Parametresi ve Sonuçta Elde Edilen SQL Dizesi
| Büyük/küçük harf durumu | lpszSQL'de geçirdiğiniz şey | Sonuçta elde edilen SELECT deyimi |
|---|---|---|
| 1 | null |
SELECTrfx-field-listFROMtablo-adıCRecordset::Open, tablo adını almak için GetDefaultSQL'yi çağırır. Elde edilen dize, GetDefaultSQL'nın ne döndürdüğüne bağlı olarak 2 ile 5 arasındaki durumlardan biridir. |
| 2 | Tablo adı |
SELECTrfx-field-listFROMtablo-adı Alan listesi, RFX ifadelerinden DoFieldExchange alınır.
m_strFilter ve m_strSort boş değilse, WHERE ve/veya ORDER BY tümcelerini ekler. |
| 3* | WHERE veya ORDER BY yan tümcesi olmadan eksiksiz bir SELECT deyimi | Geçildikçe.
m_strFilter ve m_strSort boş değilse, WHERE ve/veya ORDER BY tümcelerini ekler. |
| 4 * | WHERE ve/veya ORDER BY yan tümcesiyle eksiksiz bir SELECT deyimi | Geçildikçe.
m_strFilter ve/veya m_strSort boş kalmalıdır ya da iki filtre ve/veya sıralama deyimi oluşturulur. |
| 5 * | Saklı yordama çağrı | Geçildikçe. |
*
m_nFieldsSELECT deyiminde belirtilen sütun sayısından küçük veya buna eşit olmalıdır. SELECT deyiminde belirtilen her sütunun veri türü, ilgili RFX çıkış sütununun veri türüyle aynı olmalıdır.
Olay 1 lpszSQL = NULL
Kayıt kümesinin seçimi, CRecordset::Open çağrıldığında GetDefaultSQL tarafından döndürülenlere bağlıdır. 2'den 5'e kadar olan durumlar mümkün dizeleri tanımlar.
Case 2 lpszSQL = bir Tablo Adı
Kayıt kümesi, kayıt kümesi sınıfının DoFieldExchange geçersiz kılmasında, RFX işlevi çağrılarında 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 bir sihirbaz kullandıysanız, bu durum 1. durumla aynı sonucu alır (sihirbazda belirttiğiniz tablo adını geçirmeniz şartıyla). Sınıfınızı yazmak için sihirbaz kullanmazsanız, SQL deyimini oluşturmanın en kolay yolu 2. durumdur.
Aşağıdaki örnek, MFC veritabanı uygulamasından kayıtları seçen bir SQL deyimi oluşturur. Çerçeve üye işlevini çağırdığında GetDefaultSQL , işlev tablonun SECTIONadını döndürür.
CString CEnrollSet::GetDefaultSQL()
{
return "SECTION";
}
SQL SELECT deyimine ait sütunların adlarını almak için çerçeve üye işlevini çağırır DoFieldExchange .
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 şöyle görünür:
SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo
FROM SECTION
Case 3 lpszSQL = a SELECT/FROM Deyimi
Sütun listesini otomatik olarak oluşturmak için RFX'e güvenmek yerine el ile belirtirsiniz. Bunu şu durumlarda yapmak isteyebilirsiniz:
SELECT'in ardından DISTINCT anahtar sözcüğünü belirtmek istiyorsunuz.
Sütun listeniz,
DoFieldExchangeiçindeki sütun adları ve türleriyle, listelendikleri sırayla eşleşmelidir.ODBC işlevini
::SQLGetDatakullanarak sütun değerlerini elle almak için bir nedeniniz vardır; bu, sütunları sizin için bağlamak ve almak için RFX'e güvenmeye alternatif bir yöntemdir.Örneğin, uygulamanızın bir müşterisinin uygulama dağıtıldıktan sonra veritabanı tablolarına eklediği yeni sütunları barındırmak isteyebilirsiniz. Sınıfı bir sihirbaz kullanarak bildirdiğiniz sırada bilinmeyen bu ek alan veri üyelerini eklemeniz gerekiyor.
tr-TR: Sütun listeniz,
DoFieldExchangeiçinde listelendikleri sıraya göre sütun adları ve türleriyle ve ardından el ile bağlanan sütunların adlarıyla eşleşmelidir. Daha fazla bilgi için bkz . Kayıt Kümesi: Veri Sütunlarını Dinamik Olarak Bağlama (ODBC).FROM yan tümcesinde birden çok tablo belirterek tabloları birleştirmek istiyorsunuz.
Bilgi ve örnek için bkz . Kayıt Kümesi: Birleştirme Gerçekleştirme (ODBC).
Case 4 lpszSQL = SELECT/FROM Plus WHERE ve/veya ORDER BY
Her şeyi belirtirsiniz: sütun listesi (RFX çağrılarına göre DoFieldExchange), tablo listesi ve WHERE ve/veya ORDER BY koşulunun içeriği. WHERE ve/veya ORDER BY yan tümcelerinizi bu şekilde belirtirseniz, m_strFilter ve/veya m_strSort kullanmayın.
Durum 5 lpszSQL = Saklı Yordam Çağrısı
Önceden tanımlanmış bir sorguyu (microsoft SQL Server veritabanındaki saklı yordam gibi) çağırmanız gerekiyorsa, lpszSQL'e geçirdiğiniz dizeye bir CALL deyimi yazmanız gerekir. Sihirbazlar, önceden tanımlanmış bir sorguyu çağırmak için kayıt kümesi sınıfı bildirmeyi desteklemez. Önceden tanımlanmış sorguların tümü kayıtları döndürmez.
Önceden tanımlanmış bir sorgu kayıtları döndürmezse, üye işlevini CDatabase doğrudan kullanabilirsinizExecuteSQL. Kayıtları döndüren önceden tanımlanmış bir sorgu için yordamın döndürdüğü tüm sütunlar için RFX çağrılarını DoFieldExchange el ile de yazmanız gerekir. RFX çağrıları aynı sırada olmalı ve önceden tanımlanmış sorguyla 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.
SQL: SQL ve C++ Veri Türleri (ODBC)
SQL: Doğrudan SQL Çağrıları Yapma (ODBC)