<DIV>
<DIV>Rafael, </DIV>
<DIV>&nbsp;</DIV>
<DIV>Estou enviando uma fração do meu código base para acessar o SQL Server, tome o cuidado (e faça as alterações necessárias) com as constantes que estão no código.</DIV>
<DIV>&nbsp;</DIV>
<DIV>O código acessa o SQL via Ado, e está com as melhores práticas de acesso neste componente.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Se você tiver interessado em ver as 1001 connection strings para OLEDB, dê uma olhada no link <A href="http://www.able-consulting.com/MDAC/ADO/Connection/OLEDB_Providers.htm">http://www.able-consulting.com/MDAC/ADO/Connection/OLEDB_Providers.htm</A></DIV>
<DIV>&nbsp;</DIV>
<DIV>Solli M. Honorio</DIV>
<DIV>&nbsp;</DIV>
<DIV>&lt;code&gt;</DIV>
<DIV>use Win32::OLE qw(in);<BR>use Win32::OLE::Const;</DIV>
<DIV>sub ConnectDB<BR>{<BR>&nbsp;&nbsp;&nbsp; my $DBConn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Win32::OLE-&gt;new('ADODB.Connection');<BR>&nbsp;&nbsp;&nbsp; my $DB_CONNECTION = shift;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; $DBConn-&gt;Open( $DB_CONNECTION );</DIV>
<DIV>&nbsp;&nbsp;&nbsp; if ( Win32::OLE-&gt;LastError() )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $Error = Win32::OLE-&gt;LastError();<BR>&nbsp;# Trate o erro aqui !!!<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return undef;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $DBConn;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</DIV>
<DIV>sub DBExecute<BR>{<BR>&nbsp;&nbsp;&nbsp; my ($DB_CONNECTION, $String, $ToReturn, $ErrosReturn ) = @_;<BR>&nbsp;&nbsp;&nbsp; my ($DBConn, $RS, $ArgCount);<BR>&nbsp;&nbsp;&nbsp; my $Loop = 0;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; return INVALID_PARAMETER if ( ref ( $String ) );<BR>&nbsp;&nbsp;&nbsp; return NULL_PARAMETER&nbsp;&nbsp;&nbsp; if (! $String );</DIV>
<DIV>&nbsp;&nbsp;&nbsp; $ArgCount = ( scalar (@_) - 2 );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Get number of argument<BR>&nbsp;&nbsp;&nbsp; if ( $DBConn = ConnectDB($DB_CONNECTION) )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Try to connect on DB<BR>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ... if ok ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! $ArgCount )&nbsp; # If has just one argument, then it's mean<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # no recordset<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DBConn-&gt;Execute ( $String, undef, (0x00000080 + 0x0001) );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Otherwise mean recordset<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RS = $DBConn-&gt;Execute ( $String );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( Win32::OLE-&gt;LastError() )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If any error happen, write error message on EventLog<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # and abort this class.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $Error = Win32::OLE-&gt;LastError();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteEventLog ( $ENV{COMPUTERNAME},&nbsp;&nbsp;&nbsp; # Computer name<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR_DB_EXCUTE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Event ID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Error,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EVT_ERROR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Event Type<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_DB_EXCUTE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! $ArgCount ) # Return ok if don't need anything more<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $DBConn-&gt;Close(); return };</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Clear any before data on an array ref.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map { pop @{$ToReturn} } @{$ToReturn};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Save the result on array.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Get all message returned by ADO connection<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $Error ( in ( $DBConn-&gt;Errors() ) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $Description = $Error-&gt;{Description};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Description&nbsp;&nbsp;&nbsp; =~ s/\s*$//;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push @{$ErrosReturn}, $Description;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( defined $RS-&gt;{EOF} )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (! $RS-&gt;{EOF} )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my %hash = ();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $field ( in ( $RS-&gt;Fields() ) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $hash{$field-&gt;{Name}} = $field-&gt;{Value}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push @{$ToReturn}, \%hash;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RS-&gt;MoveNext;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eval { $RS = $RS-&gt;NextRecordSet(); };<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last if ( $@ );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Clean all object used by ADO connection...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RS-&gt;Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DBConn-&gt;Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; undef $RS;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; undef $DBConn;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_DB_CONNECT;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</DIV>
<DIV>my $ConnectionString = "Provider=sqloledb; Data Source=Server; Initial Catalog=master;Integrated Security=SSPI";<BR>my $string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "select * from table";</DIV>
<DIV>DBExecute ($ConnectionString, $string, \@Return );<BR>&lt;/code&gt;</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD class=txt width=100 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2><B>De:</B></FONT></TD>
<TD class=txt width=400 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2>cascavel-pm-bounces@pm.org</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD class=txt width=100 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2><B>Para:</B></FONT></TD>
<TD class=txt width=400 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2>cascavel-pm@pm.org</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD class=txt width=100 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2><B>Cópia:</B></FONT></TD>
<TD class=txt width=400 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD class=txt width=100 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2><B>Data:</B></FONT></TD>
<TD class=txt width=400 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2>Mon, 14 Feb 2005 12:04:46 -0300</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD class=txt width=100 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2><B>Assunto:</B></FONT></TD>
<TD class=txt width=400 bgColor=#d8d8d8><FONT face="Trebuchet MS; verdana; arial" size=2>[Cascavel-pm] Conectar o SQL Server</FONT></TD></TR></TBODY></TABLE></DIV>
<DIV>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR>
<TD width=100 bgColor=#e8e8e8>&nbsp;</TD>
<TD width=400 bgColor=#e8e8e8>&nbsp;</TD></TR></TBODY></TABLE></DIV>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<STYLE></STYLE>

<DIV>&gt; <FONT face=Tahoma size=2>Olá Monges,</FONT></DIV>
<DIV>&gt; <FONT face=Tahoma size=2></FONT>&nbsp;</DIV>
<DIV>&gt; <FONT face=Tahoma size=2>&nbsp; Alguém sabe me dizer se existe algum módulo para conectar ao SQL Server?</FONT></DIV>
<DIV>&gt; <FONT face=Tahoma size=2></FONT>&nbsp;</DIV>
<DIV>&gt; <FONT face=Tahoma size=2>Desde já agradeço.</FONT></DIV>
<DIV>&gt; <FONT face=Tahoma size=2></FONT>&nbsp;</DIV>
<DIV>&gt; <FONT style="FONT-SIZE: 11px; COLOR: #333333; FONT-FAMILY: Verdana,Tahoma,sans-serif">Um abraço,<BR>
<HR color=#ce0000 SIZE=1>
Rafael Szarblewski - Sistêmica Computadores<BR>Desenvolvedor Web<BR><A class=link href="mailto:rafael@sistemica.info">rafael@sistemica.info</A><BR>Fone: (51)3328-11-22 </FONT></DIV></DIV>