У меня есть сценарий, в котором мне нужно запросить таблицу Excel с помощью SQL. В Excel у меня есть столбец под названием «test_case_id», который содержит буквенно-цифровое значение. Я использую следующий код vbscript для получения значений из Excel. Столбец «test_case_id» в Excel был отформатирован как «Общий». Если значение этого столбца является целым числом (например, 1,2,3 ...)

SELECT  *   FROM [05 Invest Allocate$] WHERE [test_case_id] =1

Вышеупомянутый запрос, похоже, работает

Но когда в столбце test_case_id есть символ (например, 5b, 6b, 7b)

SELECT  *   FROM [05 Invest Allocate$] WHERE [test_case_id] ='5b'

Приведенный выше запрос дает ошибку «Несоответствие типа данных в выражении критерия».

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

Полный код:

strQuery = "SELECT  *   FROM [05 Invest Allocate$] WHERE [test_case_id] ='5b'"
j_drive_root_path="C:\Documents and Settings\Desktop\"

Set objNetwork = CreateObject("WScript.Network")
            strUserName =objNetwork.UserName

            Set fso = CreateObject("Scripting.FileSystemObject")
            Set original = fso.GetFile(j_drive_root_path & "temp_invest_allocate.xls")

            strCopyPath = "C:\Documents and Settings\" & strUsername & "\copyofexceltable.xls"
            original.Copy (strCopyPath)

            'Set the connection object and path to the copied spreadsheet       
            Set objAdCon =  CreateObject("ADODB.Connection")

            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & strCopyPath & ";" & _
                      "Extended Properties=""Excel 8.0;HDR=Yes"""

            'Open spreadsheet
            objAdCon.Open strConn

            'Create a recordest object (to store the results of the query)
            Set record_set = CreateObject("ADODB.Recordset")

            'Run the query
            record_set.CursorLocation = 3

            record_set.Open strQuery, objAdCon, 1, 3

            If Not record_set.EOF Then
                Set client_to_accountID = CreateObject("Scripting.Dictionary")
                client_to_accountID.CompareMode=vbTextCompare
                client_to_accountID.RemoveAll

                Do Until record_set.EOF
                        tmp_val=Trim(Cstr(record_set("id").Value))
                        print "id=" & tmp_val
                        record_set.MoveNext
                Loop
            End If ' End of if not record_set.EOF
0
Vikas 30 Авг 2011 в 12:57

2 ответа

Лучший ответ

В http://support.microsoft.com/kb/257819 говорится:

Например: в ваших восьми (8) отсканированных строках, если столбец содержит пять (5) числовых значений и три (3) текстовых значения, поставщик возвращает пять (5) чисел и три (3) нулевых значения. В восьми (8) отсканированных строках, если столбец содержит три (3) числовых значения и пять (5) текстовых значений, поставщик возвращает три (3) нулевых значения и пять (5) текстовых значений. В восьми (8) отсканированных строках, если столбец содержит четыре (4) числовых значения и четыре (4) текстовых значения, поставщик возвращает четыре (4) числа и четыре (4) нулевых значения. В результате, если ваш столбец содержит смешанные значения, ваш единственный выход - сохранить числовые значения в этом столбце в виде текста и преобразовать их обратно в числа, когда это необходимо в клиентском приложении, с помощью функции Visual Basic VAL или ее эквивалента.

Чтобы обойти эту проблему для данных, доступных только для чтения, включите режим импорта с помощью параметра «IMEX = 1» в разделе «Расширенные свойства» строки подключения. Это приводит к принудительному использованию параметра реестра ImportMixedTypes = Text. Однако учтите, что обновления могут давать неожиданные результаты в этом режиме. Для получения дополнительных сведений об этом параметре щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Microsoft: 194124 PRB: значения Excel возвращаются как NULL с использованием DAO OpenRecordset

Возможно, вам потребуется изменить TypeGuessRows на 0 в реестре по адресу

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/
0
Fionnuala 30 Авг 2011 в 09:25

Если вы используете Win7 64bit, расположение - My Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel

1
user2570198 30 Янв 2014 в 21:00