Hi Gurus,
I am getting the following error while trying to insert into database.I am
getting the following only for this table, For all other tables I am able to
isnert data
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------
DBD::mysql::st execute failed: Column count doesn't match value count at row
1 a
t db_access.pm line 63.
Below is my script
my $XML_FILE="E:/Project/scripts/Master.xml";
my $ref = eval { XMLin($XML_FILE) };
my $DB_CLASS_OBJ;
my $RECS;
my $ATTEMPTED_RECS=0;
my $table="test";
my $LOGFILE="E:/project/database/logs/logs.txt";
(open my $FH_LOG_FILE, '>', $LOGFILE) or die "$!";
$DB_CLASS_OBJ=DB_ACCESS->new("fashion","127.0.0.1","3306","root","sqlroot123
");
$DB_CLASS_OBJ->DB_CONN;
$RECS=$DB_CLASS_OBJ->DB_VALIDATE($table);
print $FH_LOG_FILE "Before Inserting No. of Recs in $table are : $RECS\n";
foreach my $REC (@{$ref->{Course}})
{
$ATTEMPTED_RECS++;
my $sql="insert into $table values
('2345','4355','834','894,'766');
$DB_CLASS_OBJ->DB_INSERT("$sql");
$DB_CLASS_OBJ->DB_FINISH;
}
$DB_CLASS_OBJ->DB_DISCONNECT;
close $FH_LOG_FILE;
Below is the module which I am using in the script..
#!/usr/bin/perl -w
package DB_ACCESS;
use strict;
use warnings;
use DBI;
sub new
{
my $class=shift;
my $db_name=shift;
my $hostname=shift;
my $port=shift;
my $username=shift;
my $password=shift;
my $DB_OBJ;
my $ST_EXECUTE;
bless
{db_name=>$db_name,hostname=>$hostname,port=>$port,username=>$username,passw
ord=>$password,DB_OBJ=>$DB_OBJ,ST_EXECUTE=>$ST_EXECUTE},$class;
}
sub DB_CONN
{
my $self=shift;
my
$DSN="DBI:mysql:database=$self->{db_name};host=$self->{hostname};port=$self-
>{port}";
$self->{DB_OBJ}=DBI->connect($DSN,$self->{username},$self->{password}) or
die "Cannot connet to database $DBI::errstr\n";
}
sub DB_DML
{
my $self=shift;
my $sql=shift;
$self->{ST_EXECUTE}=$self->{DB_OBJ}->prepare($sql) or die "cannot
prepare SQL statement $DBI::errstr\n";
$self->{ST_EXECUTE}->execute() or die "cannot execute the SQL
statement $DBI::errstr\n";
my @row;
while(@row=$self->{ST_EXECUTE}->fetchrow_array())
{
print"Row:@row\n";
}
warn "Error in fetching data from the table $DBI::errstr\n" if
$DBI::err;
}
sub DB_DDL
{
my $self=shift;
my $sql=shift;
$self->{ST_EXECUTE}=$self->{DB_OBJ}->prepare($sql) or die "cannot
prepare SQL statement $DBI::errstr\n";
$self->{ST_EXECUTE}->execute or die "cannot execute the SQL
statement $DBI::errstr\n";
}
sub DB_INSERT
{
my $self=shift;
my $query=shift;
print "$query\n";
# To Turn OFF the Foriegn key checks
# $self->{ST_EXECUTE}=$self->{DB_OBJ}->prepare("set
FOREIGN_KEY_CHECKS = 0");
# $self->{ST_EXECUTE}->execute();
$self->{ST_EXECUTE}=$self->{DB_OBJ}->prepare($query) or die
"cannot prepare SQL statement $DBI::errstr\n";
$self->{ST_EXECUTE}->execute() or die "cannot execute the SQL
statement $DBI::errstr\n";
}
sub DB_FINISH
{
my $self=shift;
$self->{ST_EXECUTE}->finish;
}
sub DB_DISCONNECT
{
my $self=shift;
$self->{DB_OBJ}->disconnect or warn "Error in Disconnecting
$DBI::errstr\n";
}
sub DB_VALIDATE
{
my $self=shift;
my $table=shift;
my $no_recs=$self->{DB_OBJ}->do("select * from $table");
$self->{ST_EXECUTE}=$self->{DB_OBJ}->prepare("select * from
$table") or die "cannot prepare SQL statement $DBI::errstr\n";
$self->{ST_EXECUTE}->execute or die "cannot execute the SQL
statement $DBI::errstr\n";
my @row;
while(@row=$self->{ST_EXECUTE}->fetchrow_array())
{
print"Row:@row\n";
}
warn "Error in fetching data from the table $DBI::errstr\n" if
$DBI::err;
return $no_recs;
}
1;
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------
I am passing the "insert into $table values
('2345','4355','834','894,'766');" to DB_INSERT method in DB_ACCESS.pm but
if I print the sql_statement from the DB_INSERT method it is showing as
insert into test values ('0','0','00001','00001')
I am passing the correct number of values (which are equal to the number of
columns in the table)
Below is the table description:
| c_id | bigint(20) | NO | PRI |
| t_id | bigint(20) | NO | PRI |
| user_id | bigint(20) | NO | PRI |
| profile_id | bigint(20) | NO | PRI | | |
| cl_id | bigint(20) | NO | PRI | | |
5 rows in set (0.00 sec)
Can anybody let me know where I am going wrong.
Thanks,
PP
<<image001.gif>>
