English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Opérations de lecture DBI Ruby

DBI propose plusieurs méthodes différentes pour obtenir des enregistrements à partir de la base de données. Supposons que dbh est un handle de base de données :sth est un handle d'instruction :

numérométhode & description
1db.select_one( stmt, *bindvars ) => aRow | nil
exécuter avec bindvars lié avant les marqueurs de paramètres stmt instruction. Retourne la première ligne, retourne nil si le jeu de résultats est vide nil
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil
db.select_all( stmt, *bindvars ){ |aRow| aBlock }

exécuter avec bindvars lié avant les marqueurs de paramètres stmt instruction. Appel de cette méthode sans bloc, retourne un tableau contenant toutes les lignes. Si un bloc est fourni, la méthode est appelée pour chaque ligne.
3sth.fetch => aRow | nil
retournela ligne suivante. Si il n'y a pas de ligne suivante dans le résultat, retourne nil
4sth.fetch { |aRow| aBlock }
appelle le bloc donné pour les lignes restantes du jeu de résultats.
5sth.fetch_all => [aRow, ...]
retourne toutes les lignes restantes du jeu de résultats stockées dans l'array.
6sth.fetch_many( count ) => [aRow, ...]
retourne le nombre de lignes vers le bas dans l'array [aRow, ...] count ligne.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
retourne direction et offset ligne spécifiée. Sauf pour SQL_FETCH_ABSOLUTE et SQL_FETCH_RELATIVE, d'autres méthodes ignoreront les paramètres offsetdirection valeurs possibles des paramètres, voir le tableau suivant.
8sth.column_names => anArray
retourne le nom de la colonne
9column_info => [ aColumnInfo, ... ]
retourne un tableau d'objets ColumnInfo DBI. Chaque objet contient des informations sur une colonne, y compris le nom de la colonne, le type, la précision et d'autres informations supplémentaires.
10sth.rows => rpc
retourne le nombre de lignes traitées par l'instruction d'exécution Countretourne, si elle n'existe pas nil
11sth.fetchable? => true | false
retourne si possible de lignes truesinon retourne false
12sth.cancel
Libérer les ressources occupées par le jeu de résultats. Après l'appel de cette méthode, vous ne pouvez plus obtenir de lignes, sauf si vous appelez à nouveau execute
13sth.finish
释放准备语句所占有的资源。在调用该方法后,您就不能在该对象上调用其他进一步操作的方法了。

direction 参数

下面的值可用于 fetch_scroll 方法的 direction 参数:

常量描述
DBI::SQL_FETCH_FIRST获取第一行。
DBI::SQL_FETCH_LAST获取最后一行。
DBI::SQL_FETCH_NEXT获取下一行。
DBI::SQL_FETCH_PRIOR获取上一行。
DBI::SQL_FETCH_ABSOLUTE获取在该位置偏移处的行。
DBI::SQL_FETCH_RELATIVE获取距离当前行该偏移量的行。

在线示例

下面的示例演示了如何获取一个语句的元数据。假设我们有 EMPLOYEE 表。

#!/usr/bin/ruby -w
require "dbi"
begin
     # 连接到 MySQL 服务器
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                        "testuser", "test123")
     sth = dbh.prepare("SELECT * FROM EMPLOYEE 
                        WHERE INCOME > ?")
     sth.execute(1000)
     if sth.column_names.size == 0 then
        puts "Statement has no result set"
        printf "Number of rows affected: %d\n", sth.rows
     else
        puts "Statement has a result set"
        rows = sth.fetch_all
        printf "Number of rows: %d\n", rows.size
        printf "Number of columns: %d\n", sth.column_names.size
        sth.column_info.each_with_index do |info, i|
          printf "--- Column %d (%s) ---\n", i, info["name"]
          printf "sql_type:         %s\n", info["sql_type"]
          printf "type_name:        %s\n", info["type_name"]
          printf "precision:        %s\n", info["precision"]
          printf "scale:            %s\n", info["scale"]
          printf "nullable:         %s\n", info["nullable"]
          printf "indexed:          %s\n", info["indexed"]
          printf "primary:          %s\n", info["primary"]
          printf "unique:           %s\n", info["unique"]
          printf "mysql_type:       %s\n", info["mysql_type"]
          printf "mysql_type_name:  %s\n", info["mysql_type_name"]
          printf "mysql_length:     %s\n", info["mysql_length"]
          printf "mysql_max_length: %s\n", info["mysql_max_length"]
          printf "mysql_flags:      %s\n", info["mysql_flags"]
      end
   end
   sth.finish
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # 断开与服务器的连接
     dbh.disconnect if dbh
end

这将产生以下结果:

Statement has a result set
Number of rows: 5
Number of columns: 5
--- Column 0 (FIRST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 4
mysql_flags:      0
--- Colonne 1 (LAST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 5
mysql_flags:      0
--- Colonne 2 (AGE) ---
sql_type:         4
type_name:        INTEGER
precision:        11
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       3
mysql_type_name:  INT
mysql_length:     11
mysql_max_length: 2
mysql_flags:      32768
--- Colonne 3 (SEX) ---
sql_type:         12
type_name:        VARCHAR
precision:        1
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     1
mysql_max_length: 1
mysql_flags:      0
--- Colonne 4 (INCOME) ---
sql_type:         6
type_name:        FLOAT
precision:        12
scale:            31
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       4
mysql_type_name:  FLOAT
mysql_length:     12
mysql_max_length: 4
mysql_flags:      32768