Resumo; A primeira vez que leio um campo de dados, obtenho 0
, toda vez depois, o mesmo campo de registro lê Null
. Isso muda se eu depurar, percorrer e observar os valores nos locais/lista de observação, obtenho Null
toda vez.
Isto está no Excel VBA, usando ADODB. Conexão com um servidor MySQL na mesma máquina. Estou usando o driver mais recente que baixei e instalei de dev.mysql.com/downloads/connector/odbc
Aqui estão os campos da tabela e a primeira linha de exemplo:
Campo: | meta_id | id_do_post | meta_chave | meta_valor |
---|---|---|---|---|
Tipo: | BIGINT NÃO ASSINADO | BIGINT NÃO ASSINADO | VARCHAR | TEXTO |
Conjunto de caracteres: | binário | binário | utf8mb4 | utf8mb4 |
Primeira linha: | 21875 | 100 | vendas_totais | 0 |
Sub test()
Const sConnection As String = _
"DRIVER={MySQL ODBC 9.2 Unicode Driver};" & _
"SERVER=127.0.0.1;" & _
"DATABASE=wp_woocommercedb;" & _
"USER=root;" & _
"PASSWORD=CorporateAnxiety;" & _
"CharSet=utf8;"
Const sSQLQuery = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '100';"
Dim conn As New ADODB.Connection
conn.Open sConnection
Dim rs As New ADODB.Recordset
rs.Open sSQLQuery, conn
Debug.Print rs.Fields("meta_id")
Debug.Print rs.Fields("meta_value")
Debug.Print rs.Fields("meta_id")
Debug.Print rs.Fields("meta_value")
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub
Isto é o que ele imprime se eu simplesmente executá-lo:
21875
0
21875
Null
Era isso que eu esperava:
21875
0
21875
0
Então comecei a fuçar na janela watch/Locals. Mas quando passo por ela olhando o valor, recebo:
21875
Null
21875
Null
Incluí capturas de tela da mudança de valor, porque é muito bizarro.
Também tentei dar uma olhada em connectionstrings.com/mysql que documenta as opções de conexão que estamos passando como texto no início. Mas sem sorte.
Na minha opinião, o valor não deveria estar mudando. Posso contornar isso se for pequeno e isolado. Mas preciso saber se há mais alguma coisa com problemas. Alguma ideia do que está acontecendo?
Quando AUTO_IS_NULL não está definido, o driver muda entre zeros e nulos, acho que você precisa configurar o ODBC
"Quando
AUTO_IS_NULL
é definido, o driver não altera o valor padrão desql_auto_is_null
, deixando-o em 1, então você obtém o comportamento padrão do MySQL, não o padrão do SQL.Quando
AUTO_IS_NULL
não definido, o driver altera o valor padrãoSQL_AUTO_IS_NULL
para 0 após a conexão, para que você obtenha o padrão SQL, não o comportamento padrão do MySQL.Portanto, omitir o sinalizador desabilita a opção de compatibilidade e força o comportamento padrão do SQL.
Veja
IS NULL
. Adicionado em 3.51.13."Você está vendo zero e pensando que é 0, mas na verdade é um valor padrão
https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html
Entendi. Só tive que mudar:
rs.Open sSQLQuery, conn
para:
rs.Open sSQLQuery, conn, CursorType:=adOpenStatic
Então o terceiro argumento é um CursorTypeEnum . O padrão é
adOpenForwardOnly
. Eu tenho uma conjectura do que está acontecendo por baixo dos panos. Esse 'cursor para frente' supostamente tem a velocidade de leitura mais rápida. Eu suspeito que quando o último campo é lido, ele está de alguma forma incrementando para o próximo conjunto de registros. Até mesmo visualizar o último campo na janela Local/Watch deve contar como uma leitura, então o campo estava incrementando antes de eu chegar nele.