Aracılığıyla paylaş


Hazırlanmış Yürütme ODBC'si

Hazırlıklı yürütme, bir deyimi birden çok kez yürütmenin verimli bir yoludur. Deyim, ilk olarak bir erişim planında derlenmiş veya hazırlanmıştır. Daha sonra erişim planı bir veya daha fazla kez yürütülür. Erişim planları hakkında daha fazla bilgi için bkz . SQL Deyimini İşleme.

Hazırlanan yürütme, aynı parametreli SQL deyimini tekrar tekrar yürütmek için dikey ve özel uygulamalar tarafından yaygın olarak kullanılır. Örneğin, aşağıdaki kod çeşitli parçaların fiyatlarını güncellemek için bir ifade hazırlar. Ardından deyimini her seferinde farklı parametre değerleriyle birden çok kez yürütür.

SQLREAL       Price;  
SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0, PriceInd = 0;  
  
// Prepare a statement to update salaries in the Employees table.  
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);  
  
// Bind Price to the parameter for the Price column and PartID to  
// the parameter for the PartID column.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,  
                  &PartID, 0, &PartIDInd);  
  
// Repeatedly execute the statement.  
while (GetPrice(&PartID, &Price)) {  
   SQLExecute(hstmt);  
}  

Hazırlanmış yürütme, öncelikle deyimi yalnızca bir kez derlendiğinden, birden çok kez yürütülen deyimler için doğrudan yürütmeden daha hızlıdır; doğrudan yürütülen deyimler her yürütüldüklerinde derlenir. Eğer veri kaynağı erişim planı tanımlayıcılarını destekliyorsa, hazırlanan yürütme, sürücünün her seferinde veri kaynağına tüm bir SQL deyimi yerine bir erişim planı tanımlayıcısı göndermesi sayesinde ağ trafiğinde bir azalma sağlayabilir.

Uygulama, deyimi hazırlandıktan sonra ve yürütülmeden önce sonuç kümesinin meta verilerini alabilir. Ancak, hazırlanmış, çalıştırılmamış deyimler için meta verileri döndürmek bazı sürücüler için pahalıdır ve mümkünse uyumluluğa sahip uygulamalar tarafından önlenmelidir. Daha fazla bilgi için bkz . Sonuç Kümesi Meta Verileri.

Hazırlanan yürütme, tek bir kez yürütülen deyimler için kullanılmamalıdır. Bu tür deyimler için, ek bir ODBC işlev çağrısı gerektirdiğinden doğrudan yürütmeden biraz daha yavaş çalışır.

Önemli

SQLEndTran'ı açıkça çağırarak veya otomatik işleme modunda çalışarak bir işlemi işleme veya geri alma, bazı veri kaynaklarının bir bağlantıdaki tüm deyimler için erişim planlarını silmesine neden olur. Daha fazla bilgi için SQLGetInfo işlev açıklamasındaki SQL_CURSOR_COMMIT_BEHAVIOR ve SQL_CURSOR_ROLLBACK_BEHAVIOR seçeneklerine bakın.

Bir ifadeyi hazırlamak ve yürütmek için, uygulama:

  1. SQLPrepare'yi çağırır ve SQL deyimini içeren bir dize geçirir.

  2. Parametrelerin değerlerini ayarlar. Parametreler aslında deyimi hazırlanmadan önce veya sonra ayarlanabilir. Daha fazla bilgi için bu bölümün devamında yer alan Deyim Parametreleri bölümüne bakın.

  3. SQLExecute'ı çağırır ve veri getirme gibi gerekli ek işlemleri yapar.

  4. 2. ve 3. adımları gerektiği gibi yineler.

  5. SQLPrepare çağrıldığında sürücü:

    • sql deyimini ayrıştırmadan veri kaynağının SQL dil bilgisini kullanacak şekilde değiştirir. Bu, ODBC'deki Kaçış Sıraları'nda ele alınan kaçış dizilerinin değiştirilmesini içerir. Uygulama, SQLNativeSql çağrısı yaparak bir SQL deyiminin değiştirilmiş biçimini alabilir. SQL_ATTR_NOSCAN deyimi özniteliği ayarlanırsa kaçış dizileri değiştirilmez.

    • İfadeyi hazırlanması için veri kaynağına gönderir.

    • Daha sonra yürütülürken döndürülen erişim planı tanımlayıcısını depolar (hazırlık başarılı olduysa) veya herhangi bir hata döndürür (hazırlık başarısız olduysa). Hatalar, SQLSTATE 42000 (Söz dizimi hatası veya erişim ihlali) gibi söz dizimi hataları ve SQLSTATE 42S02 (Temel tablo veya görünüm bulunamadı) gibi anlamsal hataları içerir.

      Uyarı

      Bazı sürücüler bu noktada hata döndürmez, bunun yerine deyimi yürütülürken veya katalog işlevleri çağrıldığında bunları döndürür. Bu nedenle, SQLPrepare, aslında başarısız olduğunda başarılı olmuş gibi görünebilir.

  6. SQLExecute çağrıldığında, sürücü:

    • Geçerli parametre değerlerini alır ve gerektiğinde dönüştürür. Daha fazla bilgi için bu bölümün devamında yer alan Deyim Parametreleri bölümüne bakın.

    • Erişim planı tanımlayıcısını ve dönüştürülmüş parametre değerlerini veri kaynağına gönderir.

    • Hataları geri döndürür. Bunlar genellikle SQLSTATE 24000 (Geçersiz imleç durumu) gibi çalışma zamanı hatalarıdır. Ancak, bazı sürücüler bu noktada söz dizimsel ve anlamsal hataları geri döndürür.

Veri kaynağı sorgu hazırlamayı desteklemiyorsa, sürücü bunu mümkün olduğunca öykünmelidir. Örneğin, SQLPrepare çağrıldığında sürücü hiçbir şey yapmayabilir ve ardından SQLExecute çağrıldığında deyiminin doğrudan yürütülmesini gerçekleştirebilir.

Veri kaynağı yürütme olmadan söz dizimi denetimini destekliyorsa, sürücü SQLPrepare'nin ne zaman çağrıldığını denetlemek için deyimini gönderebilir ve SQLExecute çağrıldığında deyimini yürütme için gönderebilir.

Sürücü ifade hazırlığını taklit edemiyorsa, SQLPrepare çağrıldığında ifadeyi depolar ve SQLExecute çağrıldığında yürütme için gönderir.

Benzeştirilmiş ifade hazırlığı mükemmel olmadığından SQLExecute, genellikle SQLPrepare tarafından döndürülen hataları gösterebilir.