Pregunta

Aquí hay un fragmento de código Perl:

sub insert_timesheet {
    my $dbh = shift;
    my $entryref = shift;
    my $insertme = join(',', @_);
    my $values_template = '?, ' x scalar(@_);

    chop $values_template;
    chop $values_template; #remove trailing comma

    my $insert = "INSERT INTO timesheet( $insertme ) VALUES ( $values_template );";
    my $sth = $dbh->prepare($insert);
      debug("$insert");
    my @values;
    foreach my $entry (@_){
        push @values, $$entryref{$entry}
    }
      debug("@values");
    my $rv = $sth->execute( @values ) or die $dbh->errstr;
      debug("sql return value: $rv");
    $dbh->disconnect;
}

estoy viendo el error

DBD::SQLite::st execute failed: datatype mismatch at timesheet line 85.

El valor de $insertar:

[INSERT INTO timesheet( idx,Start_Time,End_Time,Project,Ticket_Number,Site,Duration,Notes ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? );]

Aquí están los @valores:

[null '1270950742' '1270951642' 'asdf' 'asdf' 'adsf' 15 '']

Aquí está el esquema de la 'hoja de horas'

timesheet( 
    idx INTEGER PRIMARY KEY AUTOINCREMENT 
    , Start_Time VARCHAR
    , End_Time VARCHAR
    , Duration INTEGER
    , Project VARCHAR
    , Ticket_Number VARCHAR
    , Site VARCHAR
    , Notes VARCHAR
)

Así es como se alinean las cosas:

----
Insert Statement
Schema
@values
----

idx
idx INTEGER PRIMARY KEY AUTOINCREMENT
null:  # this is not a mismatch, passing null will allow auto-increment.

Start_Time
Start_Time VARCHAR
'1270950742'

End_Time
End_Time VARCHAR
'1270951642'

Project
Project VARCHAR
'asdf'

Ticket_Number
Ticket_Number VARCHAR
'asdf'

Site
Site VARCHAR
'adsf'

Duration
Duration INTEGER
15

Notes
Notes VARCHAR
''

...No puedo ver la discrepancia en el tipo de datos.

¿Fue útil?

Solución

Intente reducir su código a fragmentos más pequeños y similares, para ver qué tan pequeño puede hacerlo y aún mostrar el error (o alternativamente, vea en qué paso desaparece el problema).Podrías eliminar una gran cantidad de código simplemente llamando execute() con una consulta de cadena simple y luego comience a eliminar campos de la declaración de inserción.

Sospecho un poco del contenido de @values ​​que estás imprimiendo; parece que hay comillas alrededor de cada valor, incluso los números enteros, que definitivamente no coincidirán con un tipo de entero.

Otros consejos

El problema era con la inserción de un 'nulo' para IDX. No insertar 'idx' explícitamente está bien, el incremento automático se encarga de eso ...

Shoulda roto hacia abajo que antes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top