A PreparedStatement represent a single SQL statement pre-compiled into byte code for later execution.
The SQL statement may contain in parameters of the form "?". Such parameters represent unspecified literal values (or "wildcards") to be filled in later by the various setter methods defined in this interface. Each in parameter has an associated index number which is its sequence in the statement. The first in '?' parameter has index 1, the next has index 2 and so on. A PreparedStatement is created by calling Connection_prepareStatement().
Consider this statement:
INSERT INTO employee(name, picture) VALUES(?, ?)
There are two in parameters in this statement, the parameter for setting the name has index 1 and the one for the picture has index 2. To set the values for the in parameters we use a setter method. Assuming name has a string value we use PreparedStatement_setString(). To set the value of the picture we submit a binary value using the method PreparedStatement_setBlob().
Note that string and blob parameter values are set by reference and must not "disappear" before either PreparedStatement_execute() or PreparedStatement_executeQuery() is called.
Example:
To summarize, here is the code in context.
PreparedStatement_T p = Connection_prepareStatement(con, "INSERT INTO employee(name, picture) VALUES(?, ?)");
PreparedStatement_setString(p, 1, "Kamiya Kaoru");
PreparedStatement_setBlob(p, 2, jpeg, jpeg_size);
PreparedStatement_execute(p);
Reuse:
A PreparedStatement can be reused. That is, the method PreparedStatement_execute() can be called one or more times to execute the same statement. Clients can also set new in parameter values and re-execute the statement as shown in this example:
PreparedStatement_T p = Connection_prepareStatement(con, "INSERT INTO employee(name, picture) VALUES(?, ?)");
for (int i = 0; employees[i].name; i++)
{
PreparedStatement_setString(p, 1, employees[i].name);
PreparedStatement_setBlob(p, 2, employees[i].picture, employees[i].picture_size);
PreparedStatement_execute(p);
}
Result Sets:
Here is another example where we use a Prepared Statement to execute a query which returns a Result Set:
PreparedStatement_T p = Connection_prepareStatement(con, "SELECT id FROM employee WHERE name LIKE ?");
PreparedStatement_setString(p, 1, "%Kaoru%");
ResultSet_T r = PreparedStatement_executeQuery(p);
while (ResultSet_next(r))
printf("employee.id = %d\n", ResultSet_getInt(r, 1));
A ResultSet returned from PreparedStatement_executeQuery() "lives" until the Prepared Statement is executed again or until the Connection is returned to the Connection Pool.
- See also:
- Connection.h ResultSet.h SQLException.h
Defines |
#define | T PreparedStatement_T |
Typedefs |
typedef struct
PreparedStatement_S * | T |
Functions |
void | PreparedStatement_setString (T P, int parameterIndex, const char *x) |
| Sets the in parameter at index parameterIndex to the given string value.
|
void | PreparedStatement_setInt (T P, int parameterIndex, int x) |
| Sets the in parameter at index parameterIndex to the given int value.
|
void | PreparedStatement_setLLong (T P, int parameterIndex, long long int x) |
| Sets the in parameter at index parameterIndex to the given long long value.
|
void | PreparedStatement_setDouble (T P, int parameterIndex, double x) |
| Sets the in parameter at index parameterIndex to the given double value.
|
void | PreparedStatement_setBlob (T P, int parameterIndex, const void *x, int size) |
| Sets the in parameter at index parameterIndex to the given blob value.
|
void | PreparedStatement_execute (T P) |
| Executes the prepared SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.
|
ResultSet_T | PreparedStatement_executeQuery (T P) |
| Executes the prepared SQL statement, which returns a single ResultSet object.
|