2015-12-07 4 views
0

Я занимаюсь экспериментированием с ADODB как средством написания подготовленных скриптов в базах данных клиентов, поскольку он бесконечно лучше, чем пакетный скриптинг с sqlcmd.ADODB COM Object возвращает -1 для значений бит 1

Раньше я заметил, что иногда результаты ADODB будут отличаться от результатов, заданных osql или sqlcmd, и при дальнейшем исследовании я обнаружил, что он всегда казался в столбцах, содержащих вещественное значение. Если я запускаю следующий код я получаю -1:

declare @test bit 
set @test=1 
select top 1 @test 

Когда логически она должна возвращать 1 в соответствии с документацией MSDN и w3schools бит типа данных на сервере SQL имеет место либо 1, 0 или нуль.

Может ли кто-нибудь объяснить, что вызывает это и как его предотвратить?

Будет ли экспортировать информацию из моей базы данных, а затем импортировать -1, а не 1 проблему, если импорт также выполняется с помощью ADODB?

+0

В качестве примечания при поиске в Интернете ответа на этот вопрос я получил рекомендации по исправлению базы данных, однако в моем примере выше не используется база данных n ot help me – KaoSDlanor

+0

@DennisKriechel - новый пользователь. Я не уверен, почему ссылки, которые я предоставил источникам моей информации, были удалены. Существует ли политика против ссылок на переполнение стека? – KaoSDlanor

+0

не беспокойтесь, я не удалял ссылку. Я просто поместил их за метку MSDN и w3schools, чтобы сделать текст более удобным для чтения. –

ответ

1

Демонстрационный Код

ConnectionString = "Provider=SQLNCLI11;" 
ConnectionString = ConnectionString & "Server=localhost;" 
ConnectionString = ConnectionString & "Database=master;" 
ConnectionString = ConnectionString & "Trusted_Connection=yes;" 

Dim Conn As Object 
Set Conn = CreateObject("ADODB.Connection") 
Conn.Open ConnectionString 
Set Recordset = Conn.Execute("SELECT convert(bit, 1) as bit") 

MsgBox Recordset.Fields("bit").Type, 0, "FieldType" 
MsgBox VarType(Recordset.Fields("bit").Value),0,"VarType" 

Это показывает, что битовые карты типов данных SQL Server до 11, который является перечисляемые значения ADODB.DataTypeEnum.adBoolean https://msdn.microsoft.com/en-us/library/ms675318(v=vs.85).aspx

Который в свою очередь, соответствует Вариан из VARTYPE 11 (VariantType.vbBoolean) https://msdn.microsoft.com/en-us/library/32bbtt2s(v=vs.90).aspx Значения бит 0 и 1 не передаются непосредственно в номера 0 и -1 ADODB.

Они фактически переходят на False & True, которые в свою очередь соответствуют целым числам 0 и -1, когда вы неявно конвертируете их в целые числа.

Вы можете продемонстрировать это, выпустив следующие команды в непосредственном окне.

Debug.Print CInt(False) 
Debug.Print CInt(True) 

Довольно где это оставляет вас с точки зрения практических советов, я не уверен, но вы, вероятно, следует обрабатывать эти значения в качестве логических переменных в коде, в отличие от чисел.

К счастью SQL Server будет неявно преобразовать -1 назад к 1 на стороне базы данных, поэтому вам не нужно беспокоиться о том, что

DECLARE @table table (b bit) 
INSERT @table (b) VALUES(-1) 
SELECT b from @table 

Дает

(1 row(s) affected) 
b 
----- 
1 

(1 row(s) affected) 

Надеемся, что это разрешенное больше путаницы чем это вызвало

+0

Ну, вы успешно объяснили, почему это происходит, и будет ли это проблемой при повторной вставке, поэтому все-в-одном отличный ответ. Спасибо за помощь – KaoSDlanor