PROBLEMA: NUMERIC incorreta e decimais conversões com localidades inglês

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 320744
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
importante Este artigo contém informações sobre como modificar o registro. Antes de modificar o registro, certifique-se de backup e certifique-se que você saiba como restaurar o registro se ocorrer um problema. Para obter informações sobre como fazer backup, restaurar e editar o registro, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
256986Descrição do registro do Microsoft Windows
Sintomas
Quando você selecionar DECIMAL ou NUMERIC dados através de OLE DB e converter os dados em DBTYPE_R8 (um double ou flutuar o tipo de dados do host para dados de ponto flutuante de 8 bytes), os valores resultantes não estejam corretos se a localidade for diferente do inglês.

Esse problema é mais provável de ocorrer nas seguintes circunstâncias:
  • As opções regionais para a conta de um processo é definida uma localidade que usa uma vírgula como separador decimal (ou símbolo decimal) e um período como o separador de milhar (ou o símbolo de agrupamento de dígitos). - e -

  • Você está conectado a um computador remotamente (por exemplo, por meio de serviços de terminal ou o Microsoft NetMeeting).
A tabela a seguir inclui exemplos de conversões incorretos:
Value Being Selected	Incorrect Conversion	Correct Conversion--------------------------------------------------------------------12345678.09		1.23457e+009		1.23457e+00712345678.000000002		1.23457e+016		1.23457e+0071.23456			123456			1.234561.2			12			1.2					
Esse comportamento pode ocorrer no Microsoft Windows 2000, Microsoft Windows XP e Microsoft Windows Server 2003. A resolução descrita neste artigo se aplica igualmente a todos os sistemas operacionais.
Causa
OLE usa uma biblioteca de conversão de dados internos para converter dados NUMERIC e decimais DBTYPE_R8. A biblioteca de conversão de dados depende do arquivo Oleaut32.dll para converter dados NUMERIC e decimais DBTYPE_R8. Oleaut32.dll chamadas primeira o Oleaut32! _VarStrFromNum método para converter o valor em uma seqüência de caracteres e, em seguida, chamadas a Oleaut32! VarR8FromStr método para converter a seqüência de caracteres resultante em uma variante.

Oleaut32! _VarStrFromNum não leva a localidade em conta e assume que o decimal e separadores de milhar são seus equivalentes em inglês ("."e"," respectivamente).

No entanto, esses caracteres são o oposto do uso do inglês em alguns locais onde o separador decimal é uma vírgula e o separador de milhar é um período. Quando você usa essas localidades, _VarStrFromNum não reconhece a vírgula como separador decimal e as informações resultantes de precisão e escala não são precisas.
Resolução
Aviso Se você usar o Editor do Registro incorretamente, você pode causar problemas sérios que talvez exijam a reinstalação do sistema operacional. A Microsoft não garante que você pode resolver problemas resultantes do uso incorreto do Editor do Registro. Use o Editor do registro por sua própria conta e risco.Para contornar este problema, use um das soluções alternativas que se seguem. Ambas essas soluções alternativas exigem que você adicione a seguinte chave do Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT VarConversionLocaleSetting
Você deve definir o valor DWORD desta chave como 1. Quando você definir esse valor como 1, Oleaut32.dll deve selecionar o formato de conversão que se baseia a identidade atual do thread que solicita esses valores. Se o perfil do usuário não existe ou não está carregado no registro, Oleaut32.dll usará as configurações padrão do sistema da seção de registro HKEY_USERS\.default\Control Panel\International .

Observação Oleaut32.dll também expõe uma função que pode ser chamada pelo aplicativo diretamente, como uma alternativa ao uso a configuração do Registro. Esta função é SetVarConversionLocaleSetting() e ele aceita um único parâmetro DWORD deve corresponder a 0, 1 ou 2 valores que são especificados. Chamar essa função não altera os valores no registro. Em vez disso, ele define valores globais em Oleaut32.dll no processo de chamada.

Solução alternativa 1

Configure o serviço para ser executado em uma conta específica e defina as opções regionais para esta conta para usar uma localidade em inglês. Quando você combina com a configuração de registro VarConversionLocaleSetting , a conversão será sempre executada em uma localidade em inglês.

Solução 2

Se você permitir que a conta para usar localidade inglês, modificar o separador decimal (ou símbolo decimal) e separador de milhar (ou símbolo de agrupamento de dígitos) para usar os equivalentes em inglês. Para fazer isso, execute as seguintes etapas:
  1. No painel de controle, clique duas vezes em Opções regionais .
  2. Clique na guia números na caixa de diálogo Opções regionais .
  3. Na lista a símbolo decimal , selecione o período (.).
  4. Na lista dígito símbolo de agrupamento , selecione a vírgula (,).
  5. Clique na guia Moeda na caixa de diálogo Opções regionais .
  6. Repita as etapas 3 e 4 e, em seguida, clique em OK .
Situação
Esse problema foi corrigido primeiro no Windows 2000 Service Pack 2.

Para resolver esse problema, obtenha o service pack mais recente para o Windows 2000. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
260910Como obter o service pack mais recente do Windows 2000
Mais Informações
A chave de registro VarConversionLocaleSetting inclui três valores possíveis. Para certificar-se Oleaut32.dll usa as opções regionais correto, você deve definir o valor de VarConversionLocaleStting como 1. Para obter mais informações sobre essa chave do Registro, consulte a seção "Referências".

Para a chave do Registro afetar os computadores que estejam executando Microsoft Windows 2000 e Microsoft Windows 2000 Service Pack 1, você deve aplicar o hotfix mencionado no Q271587. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
271587Páginas ASP usam formato de hora/data baseado no usuário que efetuou logon

Etapas para reproduzir o comportamento

Observação Siga estas etapas em um computador que não é necessário fisicamente façam logon. Se for possível, use os serviços de terminal, área de trabalho remota ou NetMeeting. Esse problema normalmente não ocorre se você seguir essas etapas quando você efetuar logon um computador diretamente (modo interativo).
  1. Copie o exemplo de código que segue estas etapas em um aplicativo de console do Microsoft Visual C++ e, em seguida, compilar o aplicativo como TestOleaut.exe.
  2. Crie uma conta de usuário no computador de teste e efetue logon como esse novo usuário.
  3. No painel de controle, clique duas vezes em Opções regionais e clique em Alemão (Alemanha) na lista A localidade (local) .
  4. Clique em Aplicar e, em seguida, clique em OK .
  5. No painel de controle, clique duas vezes em Tarefas agendadas e clique duas vezes em Adicionar tarefa agendada .
  6. Configurar uma tarefa que executa o aplicativo TestOleaut.exe, mas desativar a tarefa para que a tarefa não é executada em qualquer horário agendado.
  7. Configure essa tarefa para ser executado sob a conta que você criou na etapa 2.
  8. No Windows Explorer, clique duas vezes em TestOleaut.exe para executar o arquivo executável diretamente. Isso cria um arquivo chamado outfile.txt na raiz da unidade C.
  9. Abra outfile.txt. Observe que os valores são retornados corretamente:
    Value returned: 1.234568e+007, length: 8, status: 0						
  10. Em Tarefas agendadas , clique com o botão direito do mouse Nova tarefa e clique em Executar . Isso regrava os dados no arquivo outfile.txt, que converte através da conta que é definida para alemão para opções regionais.
  11. Abra outfile.txt novamente. Observe que a saída exibe valores que não são convertidos corretamente:
    Value returned: 1.234568e+009, length: 8, status: 0						
código de exemplo
#include "stdafx.h"#include <windows.h>#include <stdio.h>#include <stddef.h>#include <oledb.h>int main(int argc, char* argv[]){	ICommandText * pICommandText;	IDBCreateSession * pIDBCreateSession;	IDBCreateCommand * pIDBCreateCommand;	IDBInitialize * pIDBInitialize;	IDBProperties * pIDBProperties;	IRowset				*pIRowset;	IAccessor				*pIAccessor;	const ULONG nProps = 4;	DBPROP InitProperties[nProps];	DBPROPSET rgInitPropSet;	ULONG			cRowsObtained;	ULONG 			coutputBindings = 1;	DBBINDING		outputBindings[1];	DBBINDSTATUS 	outputStatus[1];	HACCESSOR		hOutputAccessor;	HROW 			rghRow;	// Row Handle	HROW			*pRow = &rghRow;	CLSID		clsid;	HRESULT		hr;	struct _outputBuffer{		DWORD status;		double value;		int length;	} outputBuffer;			outputBuffer.status = 0;	outputBuffer.value = 0.0;	if( FAILED(hr = CLSIDFromProgID(L"SQLOLEDB", &clsid) ) )		return 0;	hr = CoInitialize(NULL);	hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,	IID_IDBInitialize, (void**)&pIDBInitialize);	for (ULONG i = 0; i < nProps; i++)	{		VariantInit(&InitProperties[i].vValue);		InitProperties[i].dwOptions = DBPROPOPTIONS_REQUIRED;		InitProperties[i].colid = DB_NULLID;	}	//Level of prompting that is performed to complete the connection process.	InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;	InitProperties[0].vValue.vt = VT_I2;	InitProperties[0].vValue.iVal = DBPROMPT_NOPROMPT;	//datasource name	InitProperties[1].dwPropertyID = DBPROP_INIT_DATASOURCE;	InitProperties[1].vValue.vt = VT_BSTR;	InitProperties[1].vValue.bstrVal = SysAllocString(OLESTR("YourServer"));	//userid	InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID;	InitProperties[2].vValue.vt = VT_BSTR;	InitProperties[2].vValue.bstrVal = SysAllocString(OLESTR("sa"));	//password	InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD;	InitProperties[3].vValue.vt = VT_BSTR;	InitProperties[3].vValue.bstrVal = SysAllocString(OLESTR(""));	//Assign the four property structures to property set.	rgInitPropSet.guidPropertySet = DBPROPSET_DBINIT;	rgInitPropSet.cProperties = nProps;	rgInitPropSet.rgProperties = InitProperties;	//Set initialization properties.	pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);	pIDBProperties->SetProperties(1, &rgInitPropSet);	hr = pIDBInitialize->Initialize();	//Get the DB Session object.	hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession,				(void**)&pIDBCreateSession);	//Create the session, getting an interface for command creation.	hr = pIDBCreateSession->CreateSession(NULL, IID_IDBCreateCommand,				(IUnknown**)&pIDBCreateCommand);	pIDBCreateSession->Release();	//Create the Command object.	hr = pIDBCreateCommand->CreateCommand(NULL, IID_ICommandText,				(IUnknown**)&pICommandText);	pIDBCreateCommand->Release();	//Set the command text.	pICommandText->SetCommandText( DBGUID_DBSQL, L"select convert(decimal(10,2),12345678.09)");	//Execute the command.	hr = pICommandText->Execute(NULL, IID_IRowset,NULL,NULL,(IUnknown **)&pIRowset);	outputBindings[0].iOrdinal = 1;			//Set ordinal.	outputBindings[0].pTypeInfo = NULL;			//Reserved	outputBindings[0].pObject = NULL;			//for an OLE object	outputBindings[0].pBindExt = NULL;			//Reserved	outputBindings[0].dwPart = DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH;	outputBindings[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;	//Client-owned memory	outputBindings[0].eParamIO = DBPARAMIO_NOTPARAM;	//Not a parameter	outputBindings[0].dwFlags = 0;			//Reserved	outputBindings[0].obStatus = offsetof(_outputBuffer,status);	// Offset in consumers buffer	outputBindings[0].obValue = offsetof(_outputBuffer,value);	// Offset in consumers buffer	outputBindings[0].obLength = offsetof(_outputBuffer,length);	// Offset in consumers buffer	outputBindings[0].cbMaxLen = sizeof(outputBuffer);		// Size in bytes of the value 								// part in the consumers buffer	outputBindings[0].wType = DBTYPE_R8;				// Data type indicator	//Create the accessor.	pIRowset->QueryInterface(IID_IAccessor, (void **)&pIAccessor);	pIAccessor->CreateAccessor(		DBACCESSOR_ROWDATA,	// Accessor will be used to retrieve row data.		coutputBindings,		// Number of columns being bound		outputBindings,		// Structure that contains bind info		0,			// Not used for row accessors 		&hOutputAccessor,		// Returned accessor handle		outputStatus		// Information about binding validity	);	hr = pIRowset->GetNextRows(0, 0, 1,	&cRowsObtained,	&pRow );			//Retrieve the data, and print it to a text file.	hr = pIRowset->GetData( rghRow, hOutputAccessor, (void *)&outputBuffer);	FILE *fp;	fp = fopen( "c:\\outfile.txt", "wt" );	fprintf( fp, "Value returned: %e, length: %i, status: %i\n",outputBuffer.value, outputBuffer.length, outputBuffer.status);	fflush(fp);	fclose(fp);		//Release row handles.	pIRowset->ReleaseRows( cRowsObtained,&rghRow, NULL, NULL, NULL );	pIRowset->Release();	//Release the output accessor.	pIAccessor->ReleaseAccessor(hOutputAccessor,NULL);	pIAccessor->Release();	pICommandText->Release();		return 0;}				
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
271587Páginas ASP usam formato de hora/data baseado no usuário que efetuou logon
306044INFO: O comportamento do formato de data/hora é diferente quando acessado a partir do Active Server Pages
OLEDB dados conversão dataconvert incorreta errada OLEAUT32!_VarStrFromNum() OLEAUT32!VarR8FromStr()

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 320744 - Última Revisão: 12/07/2015 10:27:44 - Revisão: 3.1

Microsoft OLE DB 2.5, Microsoft OLE DB 2.6, Microsoft OLE DB 2.7, Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.6, Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbmt kbprb KB320744 KbMtpt
Comentários