Bagikan melalui


Pernyataan SQL Dikodekan Secara Permanen

Aplikasi yang melakukan tugas tetap biasanya berisi pernyataan SQL yang dikodekan secara permanen. Misalnya, sistem entri pesanan mungkin menggunakan panggilan berikut untuk mencantumkan pesanan penjualan terbuka:

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

Ada beberapa keuntungan dari pernyataan SQL yang dikodekan secara permanen: Mereka dapat diuji ketika aplikasi ditulis; mereka lebih mudah diimplementasikan daripada pernyataan yang dibangun pada waktu proses; dan mereka menyederhanakan aplikasi.

Menggunakan parameter pernyataan dan pernyataan persiapan memberikan cara yang lebih baik untuk menggunakan pernyataan SQL yang dikodekan secara permanen. Misalnya, tabel Bagian berisi kolom PartID, Deskripsi, dan Harga. Salah satu cara untuk menyisipkan baris baru ke dalam tabel ini adalah dengan membuat dan menjalankan pernyataan INSERT :

#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);  

Cara yang lebih baik adalah menggunakan pernyataan berparameter yang dikodekan secara permanen. Ini memiliki dua keunggulan daripada pernyataan dengan nilai data yang dikodekan secara permanen. Pertama, lebih mudah untuk membuat pernyataan berparameter karena nilai data dapat dikirim dalam jenis aslinya, seperti bilangan bulat dan angka floating-point, daripada mengonversinya menjadi string. Kedua, pernyataan seperti itu dapat digunakan lebih dari sekali hanya dengan mengubah nilai parameter dan mengeksekusinya kembali; tidak perlu membangunnya kembali.

#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);  

Dengan asumsi pernyataan ini akan dijalankan lebih dari sekali, pernyataan ini dapat disiapkan untuk efisiensi yang lebih besar:

#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);  

Mungkin cara paling efisien untuk menggunakan pernyataan adalah dengan membuat prosedur yang berisi pernyataan, seperti yang ditunjukkan dalam contoh kode berikut. Karena prosedur dibangun pada waktu pengembangan dan disimpan pada sumber data, prosedur tidak perlu disiapkan pada waktu proses. Kelemahan dari metode ini adalah bahwa sintaks untuk membuat prosedur adalah khusus DBMS dan prosedur harus dibangun secara terpisah untuk setiap DBMS tempat aplikasi dijalankan.

#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);  

Untuk informasi selengkapnya tentang parameter, pernyataan yang disiapkan, dan prosedur, lihat Menjalankan Pernyataan.