하드 코딩된 SQL 문
고정 작업을 수행하는 애플리케이션에는 일반적으로 하드 코딩된 SQL 문이 포함됩니다. 예를 들어 주문 입력 시스템은 다음 호출을 사용하여 열린 판매 주문을 나열할 수 있습니다.
SQLExecDirect(hstmt, "SELECT OrderID FROM Orders WHERE Status = 'OPEN'", SQL_NTS);
하드 코딩된 SQL 문에는 몇 가지 장점이 있습니다. 애플리케이션을 작성할 때 테스트할 수 있습니다. 런타임에 생성된 문보다 구현이 더 간단합니다. 애플리케이션을 간소화합니다.
문 매개 변수를 사용하고 문을 준비하면 하드 코딩된 SQL 문을 사용하는 더 나은 방법을 제공합니다. 예를 들어 파트 테이블에 PartID, Description 및 Price 열이 포함되어 있다고 가정합니다. 이 테이블에 새 행을 삽입하는 한 가지 방법은 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);
더 좋은 방법은 하드 코딩된 매개 변수가 있는 문을 사용하는 것입니다. 이렇게 하면 하드 코딩된 데이터 값이 있는 문보다 두 가지 이점이 있습니다. 첫째, 데이터 값을 문자열로 변환하는 대신 정수 및 부동 소수점 숫자와 같은 네이티브 형식으로 보낼 수 있으므로 매개 변수가 있는 문을 쉽게 생성할 수 있습니다. 둘째, 이러한 문은 매개 변수 값을 변경하고 다시 인덱싱하여 두 번 이상 사용할 수 있습니다. 다시 빌드할 필요가 없습니다.
#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);
이 문을 두 번 이상 실행해야 한다고 가정하면 효율성을 더욱 높일 수 있도록 준비할 수 있습니다.
#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);
다음 코드 예제와 같이 문을 사용하는 가장 효율적인 방법은 문을 포함하는 프로시저를 생성하는 것입니다. 프로시저는 개발 시 생성되고 데이터 원본에 저장되므로 런타임에 준비할 필요가 없습니다. 이 메서드의 단점은 프로시저를 만들기 위한 구문이 DBMS별이며 애플리케이션이 실행될 각 DBMS에 대해 프로시저를 별도로 생성해야 한다는 것입니다.
#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);
매개 변수, 준비된 문 및 프로시저에 대한 자세한 내용은 문 실행을 참조 하세요.