# Database Support
The `System.Data` unit provides a database-agnostic layer for executing queries and managing data, with native support for SQLite.
## DataBase Class
| Method | Description |
| :--- | :--- |
| `Create(driver, params)` | Static factory (e.g., `DataBase.Create('SQLite', ['my.db'])`). |
| `Query(sql [, params])` | Executes SELECT and returns a `DataSet`. |
| `Exec(sql [, params])` | Executes non-query (INSERT/UPDATE/DELETE). |
| `BeginTransaction` | Starts a transaction. |
| `Commit / Rollback` | Transaction control. |
## DataSet Class
| Member | Description |
| :--- | :--- |
| `Step` | Moves to next record and returns True if one exists. Practical for loops. |
| `Next` | Advances to next row. Returns False if EOF. |
| `Eof` | Returns True if the last record has been passed. |
| `FieldCount` | Number of columns in the result set. |
| `AsString(name/idx)` | Returns field value as string (using name or 0-based index). |
| `AsInteger(name/idx)` | Returns field value as integer. |
| `AsFloat(name/idx)` | Returns field value as float. |
| `IsNull(name/idx)` | Returns True if the field is NULL. |
| `StringifyAll` | Converts entire set to JSON array string. |
## Example: Querying SQLite
```pascal
uses System.Data;
var db := DataBase.Create('SQLite', [':memory:']);
db.Exec('CREATE TABLE Users (ID INTEGER, Name TEXT)');
db.Exec('INSERT INTO Users VALUES (1, "Alice")');
var ds := db.Query('SELECT Name FROM Users');
while ds.Step do
PrintLn(ds.AsString(0).ToHtml);
// OUTPUT
// Alice
```
## Parameterized Updates
```pascal
uses System.Data;
var db := DataBase.Create('SQLite', [':memory:']);
db.Exec('CREATE TABLE Users (ID INTEGER, Name TEXT)');
db.Exec('INSERT INTO Users VALUES (1, "Alice")');
db.Exec('UPDATE Users SET Name = ? WHERE ID = ?', ['Bob', 1]);
// OUTPUT NONE
```
:::info
### Driver Support
The **SQLite** driver is built-in. Other drivers can be registered by the host application to support PostgreSQL, MySQL, or SQL Server.
:::
Database Support
The System.Data unit provides a database-agnostic layer for executing queries and managing data, with native support for SQLite.
Moves to next record and returns True if one exists. Practical for loops.
Next
Advances to next row. Returns False if EOF.
Eof
Returns True if the last record has been passed.
FieldCount
Number of columns in the result set.
AsString(name/idx)
Returns field value as string (using name or 0-based index).
AsInteger(name/idx)
Returns field value as integer.
AsFloat(name/idx)
Returns field value as float.
IsNull(name/idx)
Returns True if the field is NULL.
StringifyAll
Converts entire set to JSON array string.
Example: Querying SQLite
uses System.Data;var db := DataBase.Create('SQLite',[':memory:']);
db.Exec('CREATE TABLE Users (ID INTEGER, Name TEXT)');
db.Exec('INSERT INTO Users VALUES (1, "Alice")');var ds := db.Query('SELECT Name FROM Users');while ds.Step do
PrintLn(ds.AsString(0).ToHtml);
Result
Alice
Parameterized Updates
uses System.Data;var db := DataBase.Create('SQLite',[':memory:']);
db.Exec('CREATE TABLE Users (ID INTEGER, Name TEXT)');
db.Exec('INSERT INTO Users VALUES (1, "Alice")');
db.Exec('UPDATE Users SET Name = ? WHERE ID = ?',['Bob',1]);
Driver Support
The SQLite driver is built-in. Other drivers can be registered by the host application to support PostgreSQL, MySQL, or SQL Server.