Executar procedimentos armazenados com parâmetros de data: objeto de comando vs objeto Connection

StackOverflow https://stackoverflow.com/questions/83038

Pergunta

Ao fornecer datas para um procedimento armazenado através de um parâmetro que estou um pouco confuso sobre qual o formato a ser usado para as datas. Meu sintaxe VBA original usado o objeto ADO Connection para executar o procedimento armazenado:

Set SentDetailRS = Me.ADOConnectionToIntegrity.Execute("dbo.s_SelectAggregatedSentDetailList '" & fCSQLDate(EffectiveDate) & "'", , adCmdText)

Esta multa funciona para mim usando o yyyy-mm-dd sintaxe data, mas quando outro usuário executa o código que receberá o erro: 13 'Tipo incompatível'.

Depois de algumas experiências, descobri que fornecer a data em que as correcções formato dd/mm/yyyy esse erro para o usuário, mas agora me dá o erro!

Executar o procedimento armazenado usando um objeto de comando com parâmetros funciona independentemente do formato da data (presumo ADO é cuidar da formatação nos bastidores). Eu pensei que o uso da yyyy-mm-dd formato iria trabalhar universalmente com o SQL Server?

Eu também estou perplexo a respeito de porque este problema parece ser usuário específico? Notei que meu idioma padrão no SQL Server é 'Inglês' enquanto idioma padrão do outro usuário é 'Inglês Britânico', que poderia causar o problema?

Eu estou usando ADO 2.8 com o Access 2003 e SQL Server 2000, SQL Server login é via segurança integrada do Windows.

Foi útil?

Solução

Tenha cuidado, e não acredito que ADO está cuidando do problema. formato de data Universal SQL é 'AAAAMMDD', enquanto ambos SQL e acesso são influenciadas pelas definições regionais do computador na maneira de exibir datas e convertê-los em cadeias de caracteres.

Não se esqueça que separador de Data é # no Access, enquanto ele está 'em SQL

Meu melhor conselho será para converter sistematicamente seu acesso # MM-DD-AAAA # (ou similar) em 'YYYYMMDD' antes de enviar a instrução para o servidor. Você poderia construir uma pequena função, tais como:

Public function SQLdateFormat(x_date) as string

SQLDateFormat = _
   trim(str(datePart("yyyy",x_date))) & _
   right(str(datePart("m",date)),2) & _
   right(str(datePart("d",date)),2)

   ''be carefull, you might get something like '2008 9 3'
SQLDateFormat = replace(functionSQLDateFormat," ","0")
   '' you will have the expected '20080903'

End function

Se você não programaticamente construir a sua cadeia de INSERT / UPDATE antes de enviá-lo para o servidor, então vou aconselhá-lo a transformar as configurações regionais de todas as máquinas com as configurações regionais do computador SQL hospedagem. Você também pode ter que verificar se existe um formato de data específica no seu servidor SQL (não tenho certeza). Personnaly, eu resolvi este tipo de problemas de localização (que também acontece quando coma é usado como separador decimal em francês) ou específica SQL problemas de caracteres (quando aspas ou aspas duplas estão em uma string) por recuar as instruções SQL antes de enviá-los para o servidor.

Outras dicas

Eu acho que a função fCSQLDate é específico da cultura - ou seja, ele vai analisar a data com base nas configurações de idioma do usuário. É por isso que você vê o problema.

De qualquer forma, usando consultas com cordas concatenadas é sempre uma má idéia (ataques de injeção). Você é melhor fora se você usar parâmetros.

Access usa # como delimitador de campo de data. O formato deve ser # dd / mm / aaaa # provavelmente o # mm-dd-aaaa # trabalhará igualmente bem.

Desculpe eu não sei mysql, mas com a Oracle eu sempre estado explicitamente o formato que eu estava esperando o formato a ser, por exemplo: 'DD-MM-AAAA', para evitar problemas (regionais) de formato de data

Por que não usar o formato

dd mmm yyyy

Há apenas uma maneira que pode ser interpretado.

Você pode usar a função Date () para retornar uma data universal com base na data da máquina e configurações de tempo. As configurações regionais na máquina irá determinar como ele formatado no lado do cliente. Se você abandonar o campo strictle um campo DateTime, em seguida, as configurações de região cleint pode formatar a data.

Indo para o servidor, usando o Date () função deve aslo trabalho (retornando um valor de data universal).

Além disso, use um objeto de comando e os parâmetros em sua consulta quando você passá-los para evitar ataques de injeção SQL em campos de cadeia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top