RESUMO: Não sei qual tipo de dado VBA (Data, String ou ?) armazenar a data VBA que será passada ao SQL Server para inserção por meio da definição de parâmetro ADO. Quando o parâmetro ADO JDate é estabelecido, ele pede um tipo de dado. Usei adDate, mas tenho problemas.
Minha conexão VB/ADO db está funcionando, posso passar SQL baseado em texto para inserções e leituras com sucesso. No entanto, por vários motivos, preciso alternar uma INSERT
consulta para usar parâmetros ADO em vez de apenas SQL baseado em texto.
Para testes, simplifiquei tudo isso em uma única tabela, com duas colunas simples para testes.
Tabela do SQL Server: testJournal
- tem 2 colunas: City nchar(100) not null
e JDate date not null
. Comecei a testar o código abaixo com o mesmo nome de tabela contendo apenas a City
coluna. Funcionou perfeitamente, ou seja, cada execução inseriu uma linha no SQL Server. Depois que eu excluo e recrio manualmente a mesma tabela para incluir JDate
e executar o código VBA para inserir, recebo um erro de que um Null não pode ser inserido em JDate. ou seja, a data VBA que estou fornecendo ao parâmetro ADO nunca está chegando ao SQL Server por meio do parâmetro ADO.
Alguns dos meus códigos VBA:
Dim TDate As Date
TDate = "2025-03-07"
Call mDataBase.Open("Provider=SQLOLEDB;Initial Catalog=" & pCatalog & ";Data Source=xxxxxxxxxxxxxxxx" & pServer & ";Integrated Security=SSPI")
mCmd.ActiveConnection = mDataBase
With mCmd
.Parameters.Append .CreateParameter("City", adLongVarChar, adParamInput, 100, "Beaumont")
.Parameters.Append .CreateParameter("JDate", adDate, adParamInput, TDate)
End With
.CommandText = "INSERT INTO testJournal ( City, JDate ) VALUES(?,?)"
Set mRS = mCmd.Execute
Quando a última linha acima é executada, recebo um erro de que a coluna JDate do SQL Server não permite nulos. Inspecionei o mCmd no lado do VB durante o tempo de execução. A propriedade de valor para "City" é "Beaumont". No entanto, a propriedade de valor para "JDate" é nula.
Que combinação de variáveis VBA e/ou tipos de dados de parâmetros VBA ADO devo usar para passar com sucesso minha data VBA para uma coluna de data do SQL Server?
Está faltando o parâmetro de tamanho para a linha de data. Embora seja opcional, você teria que especificar os argumentos por nome se quiser deixá-lo de fora. Se você especificá-los por ordem, como está fazendo, então precisa especificar algo para isso.
Então, como você está passando argumentos por ordem, você está passando a data no parâmetro size. Não tenho ideia de como isso está funcionando, talvez esteja convertendo isso para um inteiro de alguma forma?
Você vê o 100 na sua linha anterior. Você precisa do equivalente para a segunda linha, ou especificar os argumentos por nome em vez de por posição.
O tipo provavelmente deve ser adDBDate ou adDBTimeStamp.
Quando eu estava usando, especifiquei um tamanho de 8. Não tenho certeza se um valor válido é necessário lá. Você pode tentar 0 e ver se funciona. Ele pode ignorar isso para certos tipos.
Como eu disse no comentário, você também pode especificar como um tipo de string e deixar o sql converter para você. Mas você precisaria formatar a data no formato aaaa-mm-dd para que o sql server sempre a interprete corretamente, independentemente do local.