Como efectuar um JOIN Case-Sensitive através do Microsoft Jet

Traduções de Artigos Traduções de Artigos
Artigo: 244693 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

O motor de base de dados do Microsoft Jet é inerentemente não diferenciar maiúsculas de minúsculas. Quando associar tabelas, corresponde a minúsculas "abc" para "ABC", que, na maioria dos casos, é aconselhável maiúsculas. Este artigo descreve quatro métodos de alcançar uma JOIN sensível a maiúsculas e minúsculas que "abc" não corresponde ao "ABC".

Mais Informação

Nota : em geral, dados sensíveis a maiúsculas e minúsculas não é necessário armazenados numa base de dados. Deverá conseguir corresponder "Silva" com "JOÃO". Se precisar de armazenar dados sensíveis a maiúsculas e minúsculas, como palavras-passe, considere cuidadosamente as consequências de cada um dos métodos descritos neste artigo.

Este artigo descreve quatro métodos de alcançar uma JOIN sensível a maiúsculas e minúsculas utilizando o motor de base de dados do Microsoft Jet. Cada um destes métodos tem vantagens e desvantagens que devem ser ponderadas antes de escolher uma implementação. Os métodos são:
  • ' CompCad '
  • Controlador IISAM case-Sensitive
  • Expansão hexadecimal
  • Campo binário

' CompCad '

O método mais simples de alcançar uma JOIN sensível a maiúsculas e minúsculas é utilizar a função ' CompCad ' para comparar campos em vez do operador é igual a. Se tiver uma pesquisa de palavra-passe, este seria o método mais adequado.

JOIN não sensível a maiúsculas e minúsculas:
SELECT Table1.ID, Table1.Description
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
				
JOIN sensíveis a maiúsculas e minúsculas:
SELECT Table1.ID, Table1.Description
FROM Table1 INNER JOIN Table2 ON StrComp(Table1.ID, Table2.ID, 0) = 0
				
notas :
  1. Pode utilizar o identificador de vbBinaryCompare na instrução SQL. Tem de utilizar o valor (0).
  2. A consulta é sempre só de leitura porque os campos associados não podem ter um índice exclusivo e são tratados como um JOIN muitos-para-muitos pelo motor de consulta.
  3. Esta consulta não é visualizável no estruturador de consulta de Access, excepto como SQL. Uma versão alternativa, que é visível no estruturador de consulta de acesso:
    SELECT Table1.ID, Table1.Description
    FROM Table1, Table2
    WHERE StrComp(Table1.ID, Table2.ID, 0) = 0
    					
  4. Nenhuma das duas consultas sensível a maiúsculas e minúsculas indicadas acima são optimizáveis e desempenho é fraco em tabelas grandes. Uma versão alternativa é parcialmente optimizável:
    SELECT Table1.ID, Table1.Description
    FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
    WHERE StrComp(Table1.ID, Table2.ID, 0) = 0
    					

Controlador IISAM case-Sensitive

Este método envolve o armazenamento dos dados num formato IISAM sensível a maiúsculas e minúsculas, como, por exemplo, Paradox. Associações entre tabelas do Paradox são sensíveis a maiúsculas e inerentemente minúsculas. A desvantagem é que necessita de Paradox juntamente com o acesso a estruturar as tabelas e índices e efectuar outra manutenção nas tabelas. Além disso, o desempenho de controlador IISAM é menor do que se estiver a utilizar tabelas Jet nativas. Este método só deve ser considerado se já tiver os dados neste formato.

Expansão hexadecimal

Este método envolve a criação de uma coluna calculada que armazena uma cadeia de dígitos hexadecimais criado a partir de campo que pretende JOIN no. Uma função, tal como se segue, pode ser chamada depois de alterar o campo de chave:
Public Function StrToHex(X As Variant) As Variant
Dim I As Long, Temp As String
  If IsNull(X) Then Exit Function
  Temp = Space$(Len(X) * 2)
  For I = 1 To Len(X)
    Mid$(Temp, I * 2 - 1, 2) = Right$("0" & Hex$(Asc(Mid$(X, I, 1))), 2)
  Next I
  StrToHex = Temp
End Function
				
chamado como se segue, a função converte uma cadeia "ABC" "414243", enquanto "abc" é convertido para "616263":
  rs.AddNew
  rs!ID = Me!txtID                     ' this is the human readable data
  rs!HexID = StrToHex(rs!txtID.Value)  ' this is the Primary Key field
  rs.Update
				
é fazer hex expandida campo chave primária. A consulta seria:
SELECT Table1.ID, Table1.Description
FROM Table1 INNER JOIN Table2 ON Table1.HexID = Table2.HexID
				
notas :
  1. A consulta pode ser actualizada se colocar um índice exclusivo no campo expandido hexadecimal.
  2. A consulta pode ser optimizada para desempenho.
  3. O campo expandido hex ocupa dobro armazenamento juntamente com o campo normal.
  4. Têm de gerir a criação do campo hex expandida no código, chamando a função StrToHex sempre que o campo normal é modificado.
  5. O campo expandido hex pode obter fora de sincronia com o campo normal se a tabela não for editada através de um mecanismo controlado. Terá de fornecer um mecanismo de batch para verificar a tabela e valores hexadecimais expandida incorrectos "corrigir".
  6. Esta função foi concebida para códigos de caracteres no intervalo 0 a 255. Em algumas páginas de código, os caracteres UNICODE podem existir fora deste intervalo. Terá de modificar a função StrToHex() para processar este caso:
    Temp = Space$(Len(X) * 4)
    For I = 1 To Len(X)
      Mid$(Temp, I * 4 - 3, 4) = Right$("000" & Hex$(Asc(Mid$(X, I, 1))), 4)
    Next I
    					
    hex o campo expandido, em seguida, vai ocupar quatro vezes o espaço do campo normal.

Campo binário

Este método envolve armazenar o texto num campo binário. Interface de utilizador do Access não permite a criação de campos binários, para ter de utilizar uma instrução de SQL de definição de dados, tais como:
CREATE TABLE Table1 (ID BINARY(6) PRIMARY KEY, Description TEXT(30))
				
notas :
  1. Pode editar o campo binário como se fosse um campo de texto normal na interface de utilizador do Access.
  2. O Access 95 e 97 interfaces de utilizador armazenam o texto como ANSI.
    • Se aceder o valor do campo código, têm de gerir manualmente o conversão ANSI para UNICODE:
      Me!ctlID = StrConv(rs!binID, vbUnicode)
      rs!binID = StrConv(Me!ctlID, vbFromUnicode)
      
      						
    • No Visual Basic, o controlo de dados não ligar aos dados de ANSI.
    • Não é possível JOIN BINARY um campo a um campo de texto porque o serviço de expressão converte automaticamente os dados de texto para o UNICODE anterior para a comparação.
    • Não é possível executar uma consulta com uma condição WHERE num campo BINARY. O seguinte código não devolve quaisquer dados:
      SELECT * FROM Table1 WHERE binID = 'abc'
      
      						
  3. A interface de utilizador do Access 2000 armazena os dados no campo BINARY como UNICODE:
    • Pode JOIN um texto e um campo BINARY.
    • Controlos do Visual Basic poderão ligar ao campo BINARY e apresentá-lo, mas não é possível actualizar os dados com êxito. Se desejar poder actualizar os valores do campo, tem de gerir o controlo independente no código. Não é necessário efectuar o conversão ANSI para UNICODE que é necessário se os dados tem de ser compatíveis com o Access 95 ou 97 interface de utilizador.
    • Pode executar uma consulta com uma condição WHERE utilizando o campo BINARY:
      SELECT * FROM Table1 WHERE binID = 'abc'
      						
    • Quando armazenar dados UNICODE, terá de definir duas vezes como número de bytes como caracteres. Por exemplo, em vez de declarar um campo como TEXT(6), seria declará-lo como BINARY(12) para conseguir armazenar o mesmo número de caracteres.

Referências

Tópicos da ajuda do Microsoft Access (e do Visual Basic):
  • CRIAR TABELA
  • StrConv

Propriedades

Artigo: 244693 - Última revisão: 2 de julho de 2004 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.01
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Controlador Microsoft Open Database Connectivity para Access 3.0
  • Controlador Microsoft Open Database Connectivity para Access 3.5
  • Controlador Microsoft Open Database Connectivity para Access 3.6
Palavras-chave: 
kbmt kbhowto kbmdacnosweep KB244693 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 244693

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com