quinta-feira, 23 de abril de 2009

Fazendo o Access acessar o SQL Server com eficácia



Foi muito tempo de pesquisa para chegar até aqui. Vamos lá.

Esqueça tabelas vinculadas. A vantagem dos bancos de dados cliente/servidor sobre os bancos de dados desktop é que eles trafegam pela rede somente os dados necessários e não as tabelas inteiras. Por isso que eles são a única alternativa para grandes quantidades de dados e para operações que funcionam pela internet. Tabelas vinculadas são extremamente lentas, não tirando nenhuma vantagem de uma arquitetura cliente/servidor.

São três técnicas diferentes: uma para formulários (fonte de dados atualizável, editável), outra para consultas ODBC (consulta de passagem de dados, pass-through queries) e outra para comandos (stored procedures para SELECT, INSERT, UPDATE, DELETE).

Você vai precisar criar uma fonte de dados ODBC.

'source do formulário
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

'JESUS IS GREAT.
'create a new ADO Connection object
Set cn = New ADODB.Connection
With cn
.Provider = "MSDASQL"
.Properties("Data Source").Value = ODBC;DSN=ODBC_banco;UID=usuario;PWD=senha1;DATABASE=banco
.Open
End With

'Create an instance of the ADO recordset class, and set its properties
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = "SELECT * FROM ContasReceber WHERE CódigoCompleto = '0'"
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.Open
End With

'set the form's Recordset propery to the ADO recordset
Set Me.Recordset = rs
Me.UniqueTable = "ContasReceber"
Set rs = Nothing
Set cn = Nothing


Sequência de conexão ODBC para consultas
ODBC;DSN=ODBC_banco;SERVER=SERVIDOR\SQLEXPRESS;UID=usuario;PWD=senha1;


Código para stored procedures
Dim cnn1136 As New ADODB.Connection, cmd1136_1 As New ADODB.Command, cmd1136_2 As New ADODB.Command
cnn1136.ConnectionTimeout = 1200
cnn1136.Open "Provider=MSDASQL.1;Persist Security Info=false;Initial Catalog=banco;Data Source=ODBC_banco;UID=usuario;PWD=senha1;"


cmd1136_1.CommandText = "DELETE Fornecedores_Par WHERE Usuário = '" & Forms!Login!Usuário & "'"
cmd1136_1.CommandType = adCmdText
cmd1136_1.CommandTimeout = 1200
cmd1136_1.ActiveConnection = cnn1136
cmd1136_1.Execute
Set cmd1136_1 = Nothing


Dim SQL As String
SQL = "INSERT INTO Fornecedores_Par (CódigoCompleto, Usuário, Nome, Fantasia, Imprimir) "
SQL = SQL & "SELECT DISTINCT Fornecedores.CódigoCompleto, '" & Forms!Login!Usuário & "', "
SQL = SQL & "Fornecedores.Razão_Social, Fornecedores.Nome_Fantasia, 'N' "
SQL = SQL & "FROM Fornecedores "
SQL = SQL & "WHERE Fornecedores.Unidade = " & Forms!Unidades_AutoExec!UnidadeAtual & " "
SQL = SQL & "AND Fornecedores.DeadFile = 'N' "

cmd1136_2.CommandText = SQL
cmd1136_2.CommandType = adCmdText
cmd1136_2.CommandTimeout = 1200
cmd1136_2.ActiveConnection = cnn1136
cmd1136_2.Execute
Set cmd1136_2 = Nothing
Set cnn1136 = Nothing

Nenhum comentário:

Postar um comentário