Aracılığıyla paylaş


Hard-Coded SQL İfadeleri

Sabit bir görev gerçekleştiren uygulamalar genellikle sabit kodlanmış SQL deyimleri içerir. Örneğin, bir sipariş giriş sistemi açık satış siparişlerini listelemek için aşağıdaki çağrıyı kullanabilir:

SQLExecDirect(hstmt, "SELECT OrderID FROM Orders WHERE Status = 'OPEN'", SQL_NTS);  

Sabit kodlanmış SQL deyimlerinin çeşitli avantajları vardır: Uygulama yazıldığında test edilebilirler; bunlar, çalışma zamanında yapılan deyimlerden daha basittir; ve uygulamayı basitleştirir.

Deyim parametrelerinin kullanılması ve deyimlerin hazırlanması, sabit kodlanmış SQL deyimlerini kullanmak için daha da iyi yollar sağlar. Örneğin, Parts tablosunun PartID, Description ve Price sütunlarını içerdiğini varsayalım. Bu tabloya yeni bir satır eklemenin bir yolu , insert deyimini oluşturmak ve yürütmek olabilir:

#define DESC_LEN 51  
#define STATEMENT_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN], Statement[STATEMENT_LEN];  
SQLREAL       Price;  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Build INSERT statement.  
sprintf_s(Statement, 100, "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (%d, '%s', %f)", PartID, Desc, Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

Daha da iyi bir yol, sabit kodlanmış, parametreli bir deyim kullanmaktır. Bunun, sabit kodlanmış veri değerlerine sahip bir deyime göre iki avantajı vardır. İlk olarak, veri değerleri dizelere dönüştürmek yerine tamsayılar ve kayan noktalı sayılar gibi yerel türlerinde gönderilebildiği için parametreli bir deyim oluşturmak daha kolaydır. İkincisi, böyle bir deyim yalnızca parametre değerlerini değiştirip yeniden yürüterek birden çok kez kullanılabilir; yeniden oluşturmanıza gerek yoktur.

#define DESC_LEN 51  
  
SQLCHAR * Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

Bu deyimin birden çok kez yürütülecek olduğunu varsayarsak, daha da fazla verimlilik için hazırlanabilir:

#define DESC_LEN 51  
  
SQLCHAR *Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Prepare the INSERT statement.  
SQLPrepare(hstmt, Statement, SQL_NTS);  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecute(hstmt);  

Belki de ifadeyi kullanmanın en verimli yolu, aşağıdaki kod örneğinde gösterildiği gibi ifadeyi içeren bir prosedür oluşturmaktır. Prosedür geliştirme zamanında oluşturulup veri kaynağında depolandığından, çalışma zamanında hazırlanması gerekmez. Bu yöntemin bir dezavantajı, yordam oluşturmaya yönelik söz diziminin DBMS'ye özgü olması ve yordamların uygulamanın üzerinde çalıştırılacağı her DBMS için ayrı olarak oluşturulması gerektiğidir.

#define DESC_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecDirect(hstmt, "{call InsertPart(?, ?, ?)}", SQL_NTS);  

Parametreler, hazırlanmış deyimler ve yordamlar hakkında daha fazla bilgi için bkz. Deyimi Yürütme.