Spec-Zone.ru › Nim

src/db_connector/db_odbc

Примечание: Для использования этого модуля выполните nimble install db_connector.

Обёртка для базы данных более высокого уровня ODBC.

Этот интерфейс реализован для других баз данных.

Этот модуль ЕЩЁ НЕ был (в достаточной мере) протестирован с драйверами ODBC для баз данных Teradata, Oracle, Sybase, MSSqlvSvr и др.

В настоящее время все запросы — это вызовы ANSI, а не Unicode.

См. также: db_postgres, db_sqlite, db_mysql.

Замена параметров

Все модули db_* поддерживают один и тот же вид замены параметров. То есть, используется ? (вопросительный знак) для обозначения места, куда нужно поместить значение. Например:

sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)"

Примеры

Открытие подключения к базе данных

import db_connector/db_odbc
var db = open("localhost", "user", "password", "dbname")
db.close()

Создание таблицы

db.exec(sql"DROP TABLE IF EXISTS myTable")
db.exec(sql("""CREATE TABLE myTable (
                 id integer,
                 name varchar(50) not null)"""))

Вставка данных

db.exec(sql"INSERT INTO myTable (id, name) VALUES (0, ?)",
        "Andreas")

Большой пример

import db_connector/db_odbc
import std/math

var theDb = open("localhost", "nim", "nim", "test")

theDb.exec(sql"Drop table if exists myTestTbl")
theDb.exec(sql("create table myTestTbl (" &
    " Id    INT(11)     NOT NULL AUTO_INCREMENT PRIMARY KEY, " &
    " Name  VARCHAR(50) NOT NULL, " &
    " i     INT(11), " &
    " f     DECIMAL(18,10))"))

theDb.exec(sql"START TRANSACTION")
for i in 1..1000:
  theDb.exec(sql"INSERT INTO myTestTbl (name,i,f) VALUES (?,?,?)",
        "Item#" & $i, i, sqrt(i.float))
theDb.exec(sql"COMMIT")

for x in theDb.fastRows(sql"select * from myTestTbl"):
  echo x

let id = theDb.tryInsertId(sql"INSERT INTO myTestTbl (name,i,f) VALUES (?,?,?)",
        "Item#1001", 1001, sqrt(1001.0))
echo "Inserted item: ", theDb.getValue(sql"SELECT name FROM myTestTbl WHERE id=?", id)

theDb.close()

Импорты

odbcsql, db_common, dbutils

Типы

DbConn = OdbcConnTyp
оборачивает подключение к базе данных
InstantRow = tuple[row: seq[string], len: int]
маркер, который может быть использован для получения текста столбца строки по требованию
Row = seq[string]
строка набора данных. Значения NULL в базе данных будут преобразованы в nil.

Процедуры

proc `[]`(row: InstantRow; col: int): string {.inline, ...raises: [], tags: [],
    forbids: [].}
Возвращает текст заданного столбца строки
proc close(db: var DbConn) {....tags: [WriteDbEffect], raises: [], forbids: [].}
Закрывает подключение к базе данных.
proc dbError(db: var DbConn) {....tags: [ReadDbEffect, WriteDbEffect],
                               raises: [DbError], forbids: [].}
Поднимает исключение [DbError] с информацией об ошибке ODBC
proc dbQuote(s: string): string {.noSideEffect, ...raises: [], tags: [],
                                  forbids: [].}
Строка обрамляется кавычками базы данных.
proc exec(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]) {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
Выполняет запрос и поднимает EDB, если запрос не удался.
proc execAffectedRows(db: var DbConn; query: SqlQuery;
                      args: varargs[string, `$`]): int64 {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
Выполняет запрос (обычно "UPDATE") и возвращает количество затронутых строк
proc getAllRows(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): seq[
    Row] {....tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
Выполняет запрос и возвращает весь результат набора данных.
proc getRow(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
Возвращает одну строку. Если запрос не возвращает строк, эта процедура вернёт строку со строками-пустышками для каждого столбца.
proc getValue(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): string {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}
Выполняет запрос и возвращает первый столбец первой строки набора данных результата. Возвращает "" если набор данных не содержит строк или значение в базе данных равно NULL.
proc insert(db: var DbConn; query: SqlQuery; pkName: string;
            args: varargs[string, `$`]): int64 {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
то же, что и insertId
proc insertId(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
Выполняет запрос (обычно "INSERT") и возвращает сгенерированный ID для строки.
proc len(row: InstantRow): int {.inline, ...raises: [], tags: [], forbids: [].}
Возвращает количество столбцов в строке
proc open(connection, user, password, database: string): DbConn {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}

Открывает подключение к базе данных.

Поднимает EDb если подключение не может быть установлено.

В настоящее время параметр базы данных игнорируется, но включён для соответствия open() в других модулях библиотеки db_xxxxx.

proc setEncoding(connection: DbConn; encoding: string): bool {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}

В настоящее время для ODBC не реализовано.

Устанавливает кодировку подключения к базе данных, возвращает true для успеха, false для неудачи. result = set_character_set(connection, encoding) == 0

proc tryExec(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): bool {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}
Пытается выполнить запрос и возвращает true, если запрос выполнен успешно, иначе false.
proc tryInsert(db: var DbConn; query: SqlQuery; pkName: string;
               args: varargs[string, `$`]): int64 {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}
то же, что и tryInsertID
proc tryInsertId(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}
Выполняет запрос (обычно "INSERT") и возвращает сгенерированный ID для строки или -1 в случае ошибки.
proc unsafeColumnAt(row: InstantRow; index: int): cstring {.inline, ...raises: [],
    tags: [], forbids: [].}
Возвращает строку-c заданного столбца строки

Итераторы

iterator fastRows(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}

Выполняет запрос и итерирует по набору данных результата.

Это очень быстро, но потенциально опасно. Используйте этот итератор только если вам нужны ВСЕ строки.

Прерывание итератора fastRows() во время цикла может привести к ошибке драйвера при последующих запросах

Строки извлекаются из сервера на каждой итерации.

iterator instantRows(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): InstantRow {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}
То же, что и fastRows, но возвращает маркер, который может быть использован для получения текста столбца по требованию, используя []. Возвращённый маркер действителен только в теле итератора.
iterator rows(db: var DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
    ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}

То же, что и fastRows, но медленнее и безопаснее.

Это извлекает ВСЕ строки в память перед итерацией по строкам. Запросы с большими наборами данных повлияют на использование памяти.

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/db_odbc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API