use strict;
use DBI;
my($g_dbsource, $strSQL);
$g_dbsource={dataSource=>"dbi:ADO:Provider=SQLOLEDB;Data Source=YourSERVER;Initial Catalog=YOURDB",
			dbUsername=>"yourname",  dbPassword=>"yourpwd"};
$strSQL="INSERT INTO tbl_test (int01, varchar01) VALUES (?,?)";

#definition of table tbl_test
#CREATE TABLE [dbo].[tbl_test] ([int01] [int] NULL, [varchar01] [varchar] (50) NULL)

#ERROR 1.when execute_array is used, blank string value ('') causes ADO error
#uncomment the line below to test
#runSQLBatchDBI($g_dbsource->{dataSource}, $g_dbsource->{dbUsername}, $g_dbsource->{dbPassword}, $strSQL, [[1],['']]);

#ERROR 2.successive values are truncated to fit in the length of first value
#in database, your will see
#1		a
#2		w
#uncomment the line below to test
#runSQLBatchDBI($g_dbsource->{dataSource}, $g_dbsource->{dbUsername}, $g_dbsource->{dbPassword}, $strSQL, [[1,2],["a","will be truncated"]]);

sub runSQLBatchDBI{
	my($datasource, $user, $pwd, $stSQL, $parameter_arrays)=@_;
	my($dbh, $sth);
	$dbh = DBI->connect($datasource, $user, $pwd, {RaiseError=>0, AutoCommit=>1}) or goto errorhandler;
	$sth = $dbh->prepare($strSQL) or goto errorhandler;

	my($row_idx, $col_idx, $rowCount, $colCount, $batch_idx, $tuples, @tuple_status, $tuples_all, @para_arrays);
	$colCount = scalar(@$parameter_arrays);
	$rowCount = scalar(@{$parameter_arrays->[0]});
	#bind parameters
	for($col_idx=0;$col_idx<$colCount;$col_idx++){
		$sth->bind_param_array($col_idx+1, $parameter_arrays->[$col_idx]) or goto errorhandler;
	}
	#run batch
	undef @tuple_status;
	$tuples = $sth->execute_array({ ArrayTupleStatus => \@tuple_status });
	$sth->finish();
	$dbh->disconnect();
	return $tuples;
	
	errorhandler:
	my $dbiError;
	eval{$dbiError .= $DBI::errstr; };
	$dbiError .= "no error info from DBI" if(!$dbiError);
	print ("Error in $0\n$dbiError\n$strSQL\n");
	die;
}

