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.
Parametre dizilerini kullanan uygulamalar dizileri SQL deyimindeki parametrelere bağlar. İki bağlama stili vardır:
Her parametreye bir dizi bağlayın. Her veri yapısı (dizi) tek bir parametrenin tüm verilerini içerir. Bu, tek bir parametre için bir değer sütunu bağladığından sütun açısından bağlama olarak adlandırılır.
Tüm parametre kümesinin parametre verilerini tutacak bir yapı tanımlayın ve bu yapıların bir dizisini bağlayın. Her veri yapısı tek bir SQL deyiminin verilerini içerir. Bu, bir parametre satırını bağladığından satır başına bağlama olarak adlandırılır.
Uygulama tek değişkenleri parametrelere bağladığında olduğu gibi, dizileri parametrelere bağlamak için SQLBindParameter'ı çağırır. Tek fark, geçirilen adreslerin tek değişkenli adresler değil dizi adresleri olmasıdır. Uygulama, SQL_ATTR_PARAM_BIND_TYPE deyimi özniteliğini sütun tabanlı (varsayılan) veya satır tabanlı bağlamayı kullanıp kullanmadığını belirtmek için ayarlar. Sütun veya satır açısından bağlamanın kullanılıp kullanılmaymayacağı büyük ölçüde uygulama tercihi konusudur. İşlemcinin belleğe nasıl eriştiğine bağlı olarak, satır başına bağlama daha hızlı olabilir. Ancak, çok fazla sayıda parametre satırı dışında fark göz ardı edilebilir olabilir.
Column-Wise Bağlama
Sütun açısından bağlama kullanılırken, bir uygulama verilerin sağlandığı her parametreye bir veya iki dizi bağlar. İlk dizi veri değerlerini, ikinci dizi ise uzunluk/gösterge arabelleklerini tutar. Her dizi, parametresi için değerler olduğu kadar çok öğe içerir.
Sütun bazlı bağlama varsayılan ayardır. Uygulama ayrıca SQL_ATTR_PARAM_BIND_TYPE deyimi özniteliğini ayarlayarak satır tabanlı bağlamadan sütuna göre bağlamaya da değişebilir. Aşağıdaki görsel, sütun bazında bağlamanın nasıl çalıştığını göstermektedir.
Örneğin, aşağıdaki kod 10 öğeli dizileri PartID, Description ve Price sütunlarının parametrelerine bağlar ve 10 satır eklemek için bir deyim yürütür. Sütun açısından bağlama kullanır.
#define DESC_LEN 51
#define ARRAY_SIZE 10
SQLCHAR * Statement = "INSERT INTO Parts (PartID, Description, Price) "
"VALUES (?, ?, ?)";
SQLUINTEGER PartIDArray[ARRAY_SIZE];
SQLCHAR DescArray[ARRAY_SIZE][DESC_LEN];
SQLREAL PriceArray[ARRAY_SIZE];
SQLINTEGER PartIDIndArray[ARRAY_SIZE], DescLenOrIndArray[ARRAY_SIZE],
PriceIndArray[ARRAY_SIZE];
SQLUSMALLINT i, ParamStatusArray[ARRAY_SIZE];
SQLULEN ParamsProcessed;
memset(DescLenOrIndArray, 0, sizeof(DescLenOrIndArray));
memset(PartIDIndArray, 0, sizeof(PartIDIndArray));
memset(PriceIndArray, 0, sizeof(PriceIndArray));
// Set the SQL_ATTR_PARAM_BIND_TYPE statement attribute to use
// column-wise binding.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);
// Specify the number of elements in each parameter array.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0);
// Specify an array in which to return the status of each set of
// parameters.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0);
// Specify an SQLUINTEGER value in which to return the number of sets of
// parameters processed.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0);
// Bind the parameters in column-wise fashion.
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,
PartIDArray, 0, PartIDIndArray);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,
DescArray, DESC_LEN, DescLenOrIndArray);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,
PriceArray, 0, PriceIndArray);
// Set part ID, description, and price.
for (i = 0; i < ARRAY_SIZE; i++) {
GetNewValues(&PartIDArray[i], DescArray[i], &PriceArray[i]);
PartIDIndArray[i] = 0;
DescLenOrIndArray[i] = SQL_NTS;
PriceIndArray[i] = 0;
}
// Execute the statement.
SQLExecDirect(hstmt, Statement, SQL_NTS);
// Check to see which sets of parameters were processed successfully.
for (i = 0; i < ParamsProcessed; i++) {
printf("Parameter Set Status\n");
printf("------------- -------------\n");
switch (ParamStatusArray[i]) {
case SQL_PARAM_SUCCESS:
case SQL_PARAM_SUCCESS_WITH_INFO:
printf("%13d Success\n", i);
break;
case SQL_PARAM_ERROR:
printf("%13d Error\n", i);
break;
case SQL_PARAM_UNUSED:
printf("%13d Not processed\n", i);
break;
case SQL_PARAM_DIAG_UNAVAILABLE:
printf("%13d Unknown\n", i);
break;
}
}
Row-Wise Bağlama
Satır başına bağlama kullanılırken, bir uygulama her parametre kümesi için bir yapı tanımlar. Yapı, her parametre için bir veya iki öğe içerir. İlk öğe parametre değerini, ikinci öğe ise uzunluk/gösterge arabelleği tutar. Uygulama daha sonra bu yapılardan oluşan bir dizi ayırır ve bu dizi, her parametre için değer olduğu kadar çok öğe içerir.
Uygulama, SQL_ATTR_PARAM_BIND_TYPE deyimi özniteliğiyle sürücünün yapısının boyutunu bildirir. Uygulama, dizinin ilk yapısındaki parametrelerin adreslerini bağlar. Bu nedenle, sürücü belirli bir satır ve sütunun verilerinin adresini şu şekilde hesaplayabilir:
Address = Bound Address + ((Row Number - 1) * Structure Size) + Offset
burada satırlar 1'den parametre kümesinin boyutuna numaralandırılır. Uzaklık, tanımlanırsa, SQL_ATTR_PARAM_BIND_OFFSET_PTR deyimi özniteliği tarafından işaret edilen değerdir. Aşağıdaki çizimde satır tabanlı bağlamanın nasıl çalıştığı gösterilmektedir. Parametreler herhangi bir sırada yapıya yerleştirilebilir, ancak netlik için sıralı olarak gösterilir.
Aşağıdaki kod, Değerlerin PartID, Description ve Price sütunlarında depolanması için öğeler içeren bir yapı oluşturur. Ardından bu yapıların 10 öğeli bir dizisini ayırır ve satır başına bağlamayı kullanarak Bunu PartID, Description ve Price sütunları için parametrelere bağlar. Ardından 10 satır eklemek için bir komut çalıştırır.
#define DESC_LEN 51
#define ARRAY_SIZE 10
typedef tagPartStruct {
SQLREAL Price;
SQLUINTEGER PartID;
SQLCHAR Desc[DESC_LEN];
SQLINTEGER PriceInd;
SQLINTEGER PartIDInd;
SQLINTEGER DescLenOrInd;
} PartStruct;
PartStruct PartArray[ARRAY_SIZE];
SQLCHAR * Statement = "INSERT INTO Parts (PartID, Description,
Price) "
"VALUES (?, ?, ?)";
SQLUSMALLINT i, ParamStatusArray[ARRAY_SIZE];
SQLULEN ParamsProcessed;
// Set the SQL_ATTR_PARAM_BIND_TYPE statement attribute to use
// column-wise binding.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, sizeof(PartStruct), 0);
// Specify the number of elements in each parameter array.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0);
// Specify an array in which to return the status of each set of
// parameters.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0);
// Specify an SQLUINTEGER value in which to return the number of sets of
// parameters processed.
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0);
// Bind the parameters in row-wise fashion.
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,
&PartArray[0].PartID, 0, &PartArray[0].PartIDInd);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,
PartArray[0].Desc, DESC_LEN, &PartArray[0].DescLenOrInd);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,
&PartArray[0].Price, 0, &PartArray[0].PriceInd);
// Set part ID, description, and price.
for (i = 0; i < ARRAY_SIZE; i++) {
GetNewValues(&PartArray[i].PartID, PartArray[i].Desc, &PartArray[i].Price);
PartArray[0].PartIDInd = 0;
PartArray[0].DescLenOrInd = SQL_NTS;
PartArray[0].PriceInd = 0;
}
// Execute the statement.
SQLExecDirect(hstmt, Statement, SQL_NTS);
// Check to see which sets of parameters were processed successfully.
for (i = 0; i < ParamsProcessed; i++) {
printf("Parameter Set Status\n");
printf("------------- -------------\n");
switch (ParamStatusArray[i]) {
case SQL_PARAM_SUCCESS:
case SQL_PARAM_SUCCESS_WITH_INFO:
printf("%13d Success\n", i);
break;
case SQL_PARAM_ERROR:
printf("%13d Error\n", i);
break;
case SQL_PARAM_UNUSED:
printf("%13d Not processed\n", i);
break;
case SQL_PARAM_DIAG_UNAVAILABLE:
printf("%13d Unknown\n", i);
break;
}