OVH Cloud OVH Cloud

DBD::SQLite

11 réponses
Avatar
Scetbon Cyril
salut,

j'ai un probleme pour inserer un entier commencant par 0 dans une table
d'une base SQLite. En effet, les premiers 0 sont supprimes lors de
l'insertion. Ainsi, lorsque j'insers 01234 dans une table j'y retrouve 1234.

Quelqu'un a t il deja rencontre ce pbm avec ce module et a su le
resoudre, ou une idee ?

PS: je n'ai aucun probleme avec DBD::Oracle

10 réponses

1 2
Avatar
Jacques Caron
Salut,

On Thu, 16 Mar 2006 22:00:11 +0100, Scetbon Cyril
wrote:

j'ai un probleme pour inserer un entier commencant par 0 dans une table
d'une base SQLite. En effet, les premiers 0 sont supprimes lors de
l'insertion. Ainsi, lorsque j'insers 01234 dans une table j'y retrouve
1234.


Euh, un entier, ou une chaîne? Si c'est un entier, c'est normal, la base
de données au minimum (et éventuellement certains intermédiaires) vont le
stocker sous sa forme binaire et le retourner sous sa forme canonique. Si
c'est une chaîne, il faut veiller à ce qu'elle soit traitée comme telle à
tous les niveaux...

Quelqu'un a t il deja rencontre ce pbm avec ce module et a su le
resoudre, ou une idee ?

PS: je n'ai aucun probleme avec DBD::Oracle


Avec exactement le même code, la même structure de base de données? Ca me
paraît bizarre comme histoire...

Jacques.
--
Oxado http://www.oxado.com/

Avatar
Scetbon Cyril
j'ai juste change la connexion.

Salut,

On Thu, 16 Mar 2006 22:00:11 +0100, Scetbon Cyril
wrote:

j'ai un probleme pour inserer un entier commencant par 0 dans une
table d'une base SQLite. En effet, les premiers 0 sont supprimes lors
de l'insertion. Ainsi, lorsque j'insers 01234 dans une table j'y
retrouve 1234.


Euh, un entier, ou une chaîne? Si c'est un entier, c'est normal, la
base de données au minimum (et éventuellement certains intermédiaires)
vont le stocker sous sa forme binaire et le retourner sous sa forme
canonique. Si c'est une chaîne, il faut veiller à ce qu'elle soit
traitée comme telle à tous les niveaux...

Quelqu'un a t il deja rencontre ce pbm avec ce module et a su le
resoudre, ou une idee ?

PS: je n'ai aucun probleme avec DBD::Oracle


Avec exactement le même code, la même structure de base de données? Ca
me paraît bizarre comme histoire...

Jacques.
--Oxado http://www.oxado.com/



Avatar
Scetbon Cyril
resolut en mettant a jour la version DBD::SQLite (1.08 -> 1.11)

Par contre j'ai un souci :

le code suivant me renvoie une erreur (qui apparemment n'en est pas une)
a chaque fois.
Quelqu'un aurait il une idee ?


use strict;
use Data::Dumper;
use DBI;
my $db='storage.db';
my $sql;
my ($sth,@rows);
my $dbh = DBI->connect(
"dbi:SQLite:dbname=$db",
{
RaiseError => 0,
AutoCommit => 1
}
);
my $sth_list_channels=$dbh->prepare("select name from mytable");
my $stmt;
eval {
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK1",$/;
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK2",$/;
};
if ($@) {
print STDERR "$@n";
exit(1);
}



j'ai juste change la connexion.

Salut,

On Thu, 16 Mar 2006 22:00:11 +0100, Scetbon Cyril
wrote:

j'ai un probleme pour inserer un entier commencant par 0 dans une
table d'une base SQLite. En effet, les premiers 0 sont supprimes
lors de l'insertion. Ainsi, lorsque j'insers 01234 dans une table
j'y retrouve 1234.


Euh, un entier, ou une chaîne? Si c'est un entier, c'est normal, la
base de données au minimum (et éventuellement certains
intermédiaires) vont le stocker sous sa forme binaire et le retourner
sous sa forme canonique. Si c'est une chaîne, il faut veiller à ce
qu'elle soit traitée comme telle à tous les niveaux...

Quelqu'un a t il deja rencontre ce pbm avec ce module et a su le
resoudre, ou une idee ?

PS: je n'ai aucun probleme avec DBD::Oracle


Avec exactement le même code, la même structure de base de données?
Ca me paraît bizarre comme histoire...

Jacques.
--Oxado http://www.oxado.com/





Avatar
Jacques Caron
Salut,

On Mon, 20 Mar 2006 12:56:38 +0100, Scetbon Cyril
wrote:

le code suivant me renvoie une erreur (qui apparemment n'en est pas une)
a chaque fois.
Quelqu'un aurait il une idee ?


Et quelle serait l'erreur?

Jacques.
--
Oxado http://www.oxado.com/

Avatar
Scetbon Cyril
desole :-)

DBD::SQLite::db selectall_arrayref failed: not an error(21)

Salut,

On Mon, 20 Mar 2006 12:56:38 +0100, Scetbon Cyril
wrote:

le code suivant me renvoie une erreur (qui apparemment n'en est pas
une) a chaque fois.
Quelqu'un aurait il une idee ?


Et quelle serait l'erreur?

Jacques.
--Oxado http://www.oxado.com/



Avatar
Paul Gaborit
À (at) Mon, 20 Mar 2006 12:56:38 +0100,
Scetbon Cyril écrivait (wrote):
my $sth_list_channels=$dbh->prepare("select name from mytable");
my $stmt;
eval {
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK1",$/;
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK2",$/;
};


Vous utilisez 'selectall_arrayref' d'une manière un peu bizarre :

1- l'argument de 'selectall_arrayref' devrait être un ordre SQL.

2- le résultat est une référence et non une liste.

Si vous souhaitez passer par un $sth (comme $sth_list_channels) afin
de le préparer (et de passer d'éventuels placeholder), il faut ensuite
utiliser 'execute' puis 'fetchrow_arrayref'...

Donc :

my $statement = "select name from mytable";
my $ref = $dbh->selectall_arrayref($statement);

Ou :

my $statement = "select name from mytable";
my $sth_list_channels=$dbh->prepare($statement);
$sth_list_channels->execute();
my $ref = $sth_list_channels->fetchrow_arrayref();

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Scetbon Cyril
perldoc DBI annonce que selectall_arrayref = execute + fetchall_arrayref
Or, plusieurs selectall_arrayref successifs ne fonctionnent pas (a part
le 1er les autres renvoient undef) tandis que execute+fetchall_arrayref
fonctionne correctement.

Une idee ??

desole :-)

DBD::SQLite::db selectall_arrayref failed: not an error(21)

Salut,

On Mon, 20 Mar 2006 12:56:38 +0100, Scetbon Cyril
wrote:

le code suivant me renvoie une erreur (qui apparemment n'en est pas
une) a chaque fois.
Quelqu'un aurait il une idee ?


Et quelle serait l'erreur?

Jacques.
--Oxado http://www.oxado.com/





Avatar
Scetbon Cyril
la documentation dit que l'on peut utiliser un statement handle pour ne
pas avoir a faire x prepare pour x executions :


$ary_ref = $dbh->selectall_arrayref($statement);

The $statement parameter can be a previously prepared statement handle,
in which case the "prepare" is
skipped. This is recommended if the statement is going to be executed
many times.


À (at) Mon, 20 Mar 2006 12:56:38 +0100,
Scetbon Cyril écrivait (wrote):

my $sth_list_channels=$dbh->prepare("select name from mytable");
my $stmt;
eval {
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK1",$/;
@rows=$dbh->selectall_arrayref($sth_list_channels);
print "OK2",$/;
};



Vous utilisez 'selectall_arrayref' d'une manière un peu bizarre :

1- l'argument de 'selectall_arrayref' devrait être un ordre SQL.

2- le résultat est une référence et non une liste.

Si vous souhaitez passer par un $sth (comme $sth_list_channels) afin
de le préparer (et de passer d'éventuels placeholder), il faut ensuite
utiliser 'execute' puis 'fetchrow_arrayref'...

Donc :

my $statement = "select name from mytable";
my $ref = $dbh->selectall_arrayref($statement);

Ou :

my $statement = "select name from mytable";
my $sth_list_channels=$dbh->prepare($statement);
$sth_list_channels->execute();
my $ref = $sth_list_channels->fetchrow_arrayref();





Avatar
Paul Gaborit
À (at) Mon, 20 Mar 2006 18:43:53 +0100,
Scetbon Cyril écrivait (wrote):
la documentation dit que l'on peut utiliser un statement handle pour
ne pas avoir a faire x prepare pour x executions :


$ary_ref = $dbh->selectall_arrayref($statement);

The $statement parameter can be a previously prepared statement
handle, in which case the "prepare" is
skipped. This is recommended if the statement is going to be executed
many times.


Effectivement, vu comment est écrit DBI, cela devrait fonctionner. En
fait, personnellement, je ne passe jamais par ces fonctions de haut
niveau.

Le plus "drôle" est qu'en recopiant le code de 'selectall_arrayref'
présent dans DBI directement dans le script, ça marche :

------------------------------------------------------------
#...

sub my_selectall_arrayref {
my ($dbh, $stmt, $attr, @bind) = @_;
my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr)
or return;
$sth->execute(@bind) || return;
my $slice = $attr->{Slice}; # typically undef, else hash or array ref
if (!$slice and $slice=$attr->{Columns}) {
if (ref $slice eq 'ARRAY') { # map col idx to perl array idx
$slice = [ @{$attr->{Columns}} ]; # take a copy
for (@$slice) { $_-- }
}
}
my $rows = $sth->fetchall_arrayref($slice, my $MaxRows = $attr->{MaxRows});
$sth->finish if defined $MaxRows;
return $rows;
}

#...

# $rows = $dnh->selectall_arrayref($sth_list_channels);
$rows = my_selectall_arrayref($dbh, $sth_list_channels);

#...

# $rows = $dnh->selectall_arrayref($sth_list_channels);
$rows = my_selectall_arrayref($dbh, $sth_list_channels);

#...
------------------------------------------------------------

Je ne vois pas pourquoi ça ne marche pas... À moins d'une intercation
particulière avec DBD::SQLite ! Il faudrait aller voir le code de
DBD::SQLite ou tester avec un autre DBD pour voir si ça vient de DBI.

Ceci étant, il est inutile de faire plusieurs 'prepare'. Il suffit
d'en faire un puis de faire une suite de 'execute',
'fetchrow_arrayref' sur $sth pour obtenir le même effet (ou presque).

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Scetbon Cyril
À (at) Mon, 20 Mar 2006 18:43:53 +0100,
Scetbon Cyril écrivait (wrote):

la documentation dit que l'on peut utiliser un statement handle pour
ne pas avoir a faire x prepare pour x executions :


$ary_ref = $dbh->selectall_arrayref($statement);

The $statement parameter can be a previously prepared statement
handle, in which case the "prepare" is
skipped. This is recommended if the statement is going to be executed
many times.



Effectivement, vu comment est écrit DBI, cela devrait fonctionner. En
fait, personnellement, je ne passe jamais par ces fonctions de haut
niveau.

Le plus "drôle" est qu'en recopiant le code de 'selectall_arrayref'
présent dans DBI directement dans le script, ça marche :

------------------------------------------------------------
#...

sub my_selectall_arrayref {
my ($dbh, $stmt, $attr, @bind) = @_;
my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr)
or return;
$sth->execute(@bind) || return;
my $slice = $attr->{Slice}; # typically undef, else hash or array ref
if (!$slice and $slice=$attr->{Columns}) {
if (ref $slice eq 'ARRAY') { # map col idx to perl array idx
$slice = [ @{$attr->{Columns}} ]; # take a copy
for (@$slice) { $_-- }
}
}
my $rows = $sth->fetchall_arrayref($slice, my $MaxRows = $attr->{MaxRows});
$sth->finish if defined $MaxRows;
return $rows;
}

#...

# $rows = $dnh->selectall_arrayref($sth_list_channels);
$rows = my_selectall_arrayref($dbh, $sth_list_channels);

#...

# $rows = $dnh->selectall_arrayref($sth_list_channels);
$rows = my_selectall_arrayref($dbh, $sth_list_channels);

#...
------------------------------------------------------------

Je ne vois pas pourquoi ça ne marche pas... À moins d'une intercation
particulière avec DBD::SQLite ! Il faudrait aller voir le code de
DBD::SQLite ou tester avec un autre DBD pour voir si ça vient de DBI.

faut que je teste

Ceci étant, il est inutile de faire plusieurs 'prepare'. Il suffit
d'en faire un puis de faire une suite de 'execute',
'fetchrow_arrayref' sur $sth pour obtenir le même effet (ou presque).

je sais c'est que je fais en attendant d'avoir moins de code a ecrire.



1 2