Ошибка Jet 3011 при открытии файла с 2 «расширениями» - PullRequest
1 голос
/ 16 сентября 2009

У меня проблема с ошибкой выброса Jet 3011, когда я пытаюсь использовать ее для открытия файла с двумя "расширениями" ("filename.tst.csv").

Ошибка времени выполнения '3011'

Механизму базы данных Microsoft Jet не удалось найти объект 'filename.tst.csv'. Убедитесь, что объект существует, и что вы правильно написали его имя и путь.

Где код выглядит так:

Dim db as Database, rs as Recordset
Set db = OpenDatabase("SELECT TOP 1 * FROM [" & fileName & "];")
Set rs = db.OpenRecordset("SELECT TOP 1 * FROM [" & fileName & "];")

Я обнаружил, что проблема связана со вторым расширением (или очевидным расширением) ".tst", но я не уверен, почему возникает ошибка, и я не смог найти ответ ни через Google, ни через здесь - но я полагаю, что кто-то может иметь некоторое представление об ограничениях.

Это использует DAO 3.6 в VB6.

Ответы [ 6 ]

2 голосов
/ 16 сентября 2009

Это немного глупо, но вы можете программно переименовать файл, прежде чем открыть его для более дружественного расширения. Просто держите старое расширение, чтобы вы могли установить его обратно, когда закончите.

1 голос
/ 16 сентября 2009

Почему бы просто не использовать вместо этого короткое имя файла? Он не будет содержать более одного периода. Просто добавьте класс CFileInfo из этого предложения с превосходного сайта Карла Петерсона (в нем есть метод-обертка для вызова API GetShortPathName ).

Я полагаю, что том может не поддерживать короткие имена файлов ( необязательно ).

1 голос
/ 16 сентября 2009

Это не совсем та ситуация, о которой вы говорите, но, читая это, в разделе ПРИЧИНА информация о некоторых драйверах, не поддерживающих длинные имена файлов, выглядит так, как будто бы это применимо, поскольку это не формат 8.3.

http://social.technet.microsoft.com/Search/en-US?query=3011&ac=8

Итак, вам нужно переименовать файл ИЛИ использовать другой метод для загрузки данных (например, с помощью StreamReader). Лично я бы переименовал файл. Было бы намного проще.

0 голосов
/ 17 сентября 2009

По-моему, ваша вторая строка кода ничего не может вернуть!

Set db = OpenDatabase("SELECT TOP 1 * FROM [" & fileName & "];")

Вы не можете открыть базу данных с помощью инструкции SELECT! Ваш код выглядит как

Set db = DBEngine.Workspaces(0).OpenDatabase(filenamne)
0 голосов
/ 17 сентября 2009

Я не уверен в этом, потому что я не использовал DAO, так как он устарел в VB6. Я знаю, что правила Jet могут сильно отличаться в зависимости от поставщика OLE DB, драйвера ODBC и DAO.

Вы пытались заменить "." символы в этих именах файлов символами "#"? Или, может быть, только последний? Просто в тексте вашего оператора SQL.

0 голосов
/ 16 сентября 2009

Вам нужно либо создать файл schema.ini для файла импорта, либо добавить расширение в раздел реестра HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Text \ Format, чтобы ADO знал, как анализировать файл. Подробное объяснение на http://msdn.microsoft.com/en-us/library/ms974559.aspx

...