renamed page files

This commit is contained in:
Guenter Obiltschnig
2012-10-13 09:07:34 +00:00
parent 0b6c8aa1e0
commit 045c23a9f6
4 changed files with 22 additions and 25 deletions

View File

@@ -38,8 +38,8 @@ The following complete example shows how to use it:
} }
---- ----
The above example is pretty much self explanatory. The <[Poco/Data/Common.h]> file pulls in some common includes, The above example is pretty much self explanatory. First we pull in some necessary header files.
the SQLite::Connector is used to register the SQLite connector so that we can later create an SQLite session The SQLite::Connector is used to register the SQLite connector so that we can later create an SQLite session
via the SessionFactory. The two-argument constructor via the SessionFactory. The two-argument constructor
Sesssion ses("SQLite", "sample.db"); Sesssion ses("SQLite", "sample.db");
@@ -51,8 +51,8 @@ is actually equivalent to:
The << operator is used to send SQL statements to the Session, the <*into(count)*> simply informs the session where to store the result of the query. The << operator is used to send SQL statements to the Session, the <*into(count)*> simply informs the session where to store the result of the query.
Take note of the <!now!> at the end of the SQL statement. It is required, otherwise the statement would not be executed. Take note of the <!now!> at the end of the SQL statement. It is required, otherwise the statement would not be executed.
The <* <[ using namespace Poco::Data ]> *> is for convenience only but highly recommended for good readable code The <* <[ using namespace Poco::Data::Keywords ]> *> is for convenience only but highly recommended for good readable code
(while <* <[ ses << "SELECT COUNT(*) FROM PERSON", Poco::Data::into(count), Poco::Data::now; ]> *> is valid, it simply looks... strange). (while <* <[ ses << "SELECT COUNT(*) FROM PERSON", Poco::Data::Keywords::into(count), Poco::Data::Keywords::now; ]> *> is valid, it simply looks... strange).
The remainder of this tutorial is split up into the following parts: The remainder of this tutorial is split up into the following parts:
* Creating Sessions * Creating Sessions
@@ -66,7 +66,7 @@ The remainder of this tutorial is split up into the following parts:
Sessions are always created via the SessionFactory create method, or implicitly Sessions are always created via the SessionFactory create method, or implicitly
via the two-argument Session constructor. via the two-argument Session constructor.
Session create(const std::string& connectorKey, const std::string& connectionString); Session create(const std::string& connectorKey, const std::string& connectionString);
---- ----
The first parameter contains the type of the Session one wants to create. For the moment "SQLite" is supported The first parameter contains the type of the Session one wants to create. For the moment "SQLite" is supported
directly, and via the ODBC driver support for Oracle, SQLite, DB2, SQLServer and PostgreSQL is available. directly, and via the ODBC driver support for Oracle, SQLite, DB2, SQLServer and PostgreSQL is available.
@@ -81,7 +81,7 @@ Inserting data works by <* using *> the content of other variables. Assume we ha
If we want to insert one single forename we could write: If we want to insert one single forename we could write:
std::string aName("Peter"); std::string aName("Peter");
ses << "INSERT INTO FORENAME VALUES(" << aName << ")", now; ses << "INSERT INTO FORENAME VALUES('" << aName << "')", now;
---- ----
Another way is to use <!placeholders!> and connect each placeholder via a <!use!> Another way is to use <!placeholders!> and connect each placeholder via a <!use!>
@@ -93,9 +93,9 @@ Universal placeholders are question marks <!?!> . Rewriting the above code now s
---- ----
In this example the <!use!> expression matches the <* ? *> with the <*Peter*> value. In this example the <!use!> expression matches the <* ? *> with the <*Peter*> value.
Note that apart from the nicer syntax, the real benefit of placeholders - which is performance - doesn't show here. Note that apart from the nicer syntax, the real benefits of placeholders - which are performance and security against SQL injection attacks - don't show here.
Some database systems (e.g. SQLite) support descriptive placeholders (e.g. !:name!) but, for universal appliciablity, Some database systems (e.g. SQLite) support descriptive placeholders (e.g. <[:name]>) but, for universal applicability,
it is recommended to use the questin mark. it is recommended to use the question mark.
Check the <*Working with Statements*> section to find out more. Check the <*Working with Statements*> section to find out more.
@@ -111,7 +111,7 @@ It is also possible to combine into and use expressions:
std::string aName; std::string aName;
std::string match("Peter") std::string match("Peter")
ses << "SELECT NAME FROM FORENAME WHERE NAME=:name", into(aName), use(match), now; ses << "SELECT NAME FROM FORENAME WHERE NAME = ?", into(aName), use(match), now;
poco_assert (aName == match); poco_assert (aName == match);
---- ----
@@ -131,16 +131,16 @@ The same is true for the <*into*> statement. We select <*firstname*> as the firs
thus <*into(firstName)*> must be the first into clause. thus <*into(firstName)*> must be the first into clause.
!! Handling NULL entries !! Handling NULL entries
A common case with databases are optional data fields that can contain NULL. To accomodate for NULL, use Nullable template: A common case with databases are optional data fields that can contain NULL. To accomodate for NULL, use the Poco::Nullable template:
std::string firstName("Peter"; std::string firstName("Peter";
std::string lastName("Junior"); std::string lastName("Junior");
Nullable<int> age = 0; Poco::Nullable<int> age = 0;
ses << INSERT INTO PERSON VALUES (?, ?, ?)", use(firstName), use(lastName), use(age), now; ses << INSERT INTO PERSON VALUES (?, ?, ?)", use(firstName), use(lastName), use(age), now;
ses << "SELECT (firstname, lastname, age) FROM Person", into(firstName), into(lastName), into(age), now; ses << "SELECT (firstname, lastname, age) FROM Person", into(firstName), into(lastName), into(age), now;
---- ----
Nullable is a template wrapping any type with purpose of allowing it to have null value. Poco::Nullable is a template wrapping any type with purpose of allowing it to have null value.
!!!Working with Statements !!!Working with Statements
We mentioned the term <*Statement*> in the previous section, yet we only worked with database session objects so far. We mentioned the term <*Statement*> in the previous section, yet we only worked with database session objects so far.
@@ -180,7 +180,7 @@ simply guarantees that the statement was fully completed.
!!Prepared Statements !!Prepared Statements
A prepared statement is created by omitting the <*now*> clause. A prepared statement is created by omitting the <*now*> clause.
Statement stmt = ( ses << "INSERT INTO FORENAME VALUES(:name)", use(aName) ); Statement stmt = ( ses << "INSERT INTO FORENAME VALUES(?)", use(aName) );
---- ----
The advantage of a prepared statement is performance. Assume the following loop: The advantage of a prepared statement is performance. Assume the following loop:
@@ -210,7 +210,7 @@ The constant values <*Junior*>, <*Peter*> and <*4*> must be assigned to variable
std::string fn("Peter"), ln("Junior"); std::string fn("Peter"), ln("Junior");
int age = 4; int age = 4;
Statement stmt = (ses << "INSERT INTO PERSON VALUES (?, ?, ?)", use(fn), use(ln), use(age)); //ERR! Statement stmt = (ses << "INSERT INTO PERSON VALUES (?, ?, ?)", use(fn), use(ln), use(age)); // ERR!
stmt.execute(); stmt.execute();
---- ----
@@ -316,7 +316,7 @@ using a collection class, one would write:
And for the lazy ones, there is the <!range!> command: And for the lazy ones, there is the <!range!> command:
std::string aName; std::string aName;
Statement stmt = (ses << "SELECT NAME FROM FORENAME", into(aName), range(1,1)); Statement stmt = (ses << "SELECT NAME FROM FORENAME", into(aName), range(1, 1));
while (!stmt.done()) while (!stmt.done())
stmt.execute(); stmt.execute();
---- ----
@@ -335,13 +335,13 @@ Assume you have a class Person:
// getter and setter methods for all members // getter and setter methods for all members
[...] [...]
bool operator <(const Person& p) const bool operator < (const Person& p) const
/// we need this for set and multiset support /// we need this for set and multiset support
{ {
return _ssn < p._ssn; return _ssn < p._ssn;
} }
Poco::UInt64 operator()() const Poco::UInt64 operator() () const
/// we need this operator to return the key for the map and multimap /// we need this operator to return the key for the map and multimap
{ {
return _ssn; return _ssn;

View File

@@ -8,13 +8,13 @@ to existing code.
!!Summary of Changes !!Summary of Changes
- RowFormatter class for convenient output formatting. - Poco::Data::RowFormatter class for convenient output formatting.
- Stored procedures support (for databases that support it). - Stored procedures support (for databases and ODBC drivers that support it).
- Transaction support (for databases that support it). - Improved transaction support (for databases that support it).
- Bulk execution (for ODBC drivers that support it). - Bulk execution (for ODBC drivers that support it).
- Batch queries and multiple results (for databases and ODBC drivers that support it). - Batch queries and multiple results (for databases and ODBC drivers that support it).
- Stored procedures/functions support (for databases that support it) - Stored procedures/functions support (for databases that support it)
- Session pool containers. - New Poco::Data::SessionPoolContainer class.
!!Incompatible Changes and Possible Transition Issues !!Incompatible Changes and Possible Transition Issues

View File

@@ -1,3 +0,0 @@
For the latest version of the documentation go to
http://appinf.com/poco/wiki/tiki-index.php?page=Data