Не удается изменить тип данных в MS Access 2007 - PullRequest
4 голосов
/ 12 марта 2010

У меня есть огромная база данных (800 МБ), которая состоит из поля с именем «Дата последнего изменения» в тот момент, когда это поле вводится как текстовый тип данных, но мне нужно изменить его на поле даты / времени, чтобы выполнить некоторые запросы .

У меня есть другая точно такая же база данных, но внутри нее только 35 МБ данных, и когда я меняю тип данных, она работает нормально, но когда я пытаюсь изменить тип данных в большой базе данных, это выдает мне ошибку:

Micorosoft Office Access can't change the data type.

There isn't enough disk space or memory

После некоторых исследований некоторые сайты, упоминавшие об изменении файла реестра (MaxLocksPerFile), тоже попытались, но не повезло: - (

Может кто-нибудь помочь, пожалуйста?

Ответы [ 7 ]

3 голосов
/ 03 февраля 2016

Как говорит Джон В. Винсон , проблема, с которой вы сталкиваетесь, заключается в том, что Access хочет сохранить копию таблицы, пока вносит изменения, и из-за этого она превышает максимально допустимый размер файла доступа. Сжатие и восстановление могут помочь уменьшить размер файла, но у меня это не сработало.

Если, как и я, у вас есть много сложных связей и отчетов по старой таблице, которые вам не нужно повторять, попробуйте этот вариант решения @ user292452 вместо этого:

  1. Скопируйте таблицу (т.е. 'YourTable'), затем вставьте только структуру обратно в вашу базу данных с другим именем (т.е. 'YourTable_new').
  2. Скопируйте YourTable снова и вставьте данные в YourTable_new. (Чтобы вставить-добавить, сначала вставьте, и выберите Добавить данные к существующим Таблица.)
  3. Вы можете сделать копию вашей базы данных Access на этом этапе, на случай, если что-то пойдет не так со следующей частью.
  4. Удалить все данные в YourTable с помощью запроса на удаление --- выбрать все поля, используя звездочку, а затем запустите с настройками по умолчанию.
  5. Теперь вы можете изменить поля в YourTable по мере необходимости и сохранить еще раз.
  6. Вставьте и добавьте данные от YourTable_new до YourTable и проверьте чтобы не было ошибок при преобразовании типов, длине и т. д.
  7. Удалить YourTable_new.
1 голос
/ 05 февраля 2016

Адаптировано с Ответ Карла Донаубауэра в сообщении MSDN:

  • Переключиться в непосредственное окно (Ctl + G)
  • Выполните следующую инструкцию:

    DBEngine.SetOption dbMaxLocksPerFile, 200000


У Microsoft есть статья базы знаний , которая решает эту проблему напрямую и описывает причину:

Блокировки страниц, необходимые для транзакции, превышают значение MaxLocksPerFile, которое по умолчанию составляет 9500 блокировок. Параметр MaxLocksPerFile хранится в реестре Windows.

В статье базы знаний говорится, что она применима к Access 2002 и 2003, но она работала для меня при изменении поля в .mdb из Access 2013.

1 голос
/ 12 марта 2010

Одним из относительно утомительных (но простых) решений было бы разбить большую базу данных на меньшие базы данных, выполнить преобразование в меньшие базы данных, а затем рекомбинировать их.

Это дает дополнительное преимущество: если по какой-то причине текст является недопустимой датой в одном чанке, его будет легче найти (из-за меньшего размера чанка).

Предполагая, что у вас есть какой-то целочисленный ключ в таблице, который колеблется от 1 до (скажем) 10000000, вы можете просто выполнять запросы вроде

SELECT *
INTO newTable1
FROM yourtable
WHERE yourkey >= 0 AND yourkey < 1000000

SELECT *
INTO newTable2
FROM yourtable
WHERE yourkey >= 1000000 AND yourkey < 2000000

и т.д.

Обязательно вводите и выполняйте эти запросы отдельно, так как кажется, что Access выдаст вам синтаксическую ошибку, если вы попытаетесь запустить более одного одновременно.

Если ваши ключи - это что-то еще, вы можете сделать то же самое, но вам придется немного сложнее с предложениями WHERE.

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

EDIT

Поскольку у вас все еще есть некоторые проблемы, вот еще некоторые подробности в надежде, что вы увидите то, что я недостаточно хорошо описал раньше:

Здесь вы можете видеть, что я создал таблицу «OutputIDrive», аналогичную той, которую вы описываете. У меня есть идентификационный тег, хотя у меня есть только три записи. alt text

Здесь я создал запрос, перешел в режим SQL и ввел соответствующий оператор SQL. В моем случае, потому что мой запрос захватывает только значения> = 0 и alt text

Когда я нажимаю кнопку запуска, я получаю всплывающее окно, которое сообщает / предупреждает меня о том, что должно произойти ... это помещает строку в новую таблицу. Это хорошо ... это то, что мы ищем. Я нажимаю «ОК». alt text

Теперь наша новая таблица создана, и когда я нажимаю на нее, мы видим, что наша одна строка данных с ID = 1 была скопирована в эту новую таблицу.
alt text

Теперь вы сможете изменить имя таблицы и числовые значения в запросе SQL и запустить его снова.

Надеюсь, это поможет вам с тем, что вас сбило с толку.

РЕДАКТИРОВАТЬ 2:

Aha! Это трюк. Вы должны вводить и запускать операторы SQL по одному в Access. Если вы попытаетесь вставить несколько операторов и запустить их, вы получите эту ошибку. Итак, запустите первый, затем сотрите его, запустите второй и т. Д., И все будет в порядке. Я думаю, что это будет сделано! Я отредактировал вышесказанное, чтобы сделать его более понятным.

0 голосов
/ 12 марта 2010

Вам было предложено несколько способов обойти сообщение об ошибке дискового пространства.

Вы пытались добавить новое поле в существующую таблицу, используя тип данных Date, а затем обновили поле значением существующего строкового поля даты?Если это работает, вы можете удалить старое поле и переименовать новое в старое имя.Вероятно, это заняло бы меньше временного пространства, чем прямое преобразование строки в дату в одном поле.

Если это все еще не работает, вы можете сделать это с помощью таблицы с двумя сценариями, первое длинное целое число (сделайте его первичным ключом), второе, дата.Затем добавьте поле PK и строку даты в эту пустую таблицу.Затем добавьте новое поле даты в существующую таблицу и, используя соединение, обновите новое поле значениями из таблицы из двух столбцов.

Это может привести к той же проблеме.Это зависит от количества вещей, встроенных в ядро ​​базы данных Jet / ACE, над которыми у нас нет реального контроля.

0 голосов
/ 12 марта 2010
  1. Скопируйте таблицу (т. Е. «YourTable»), затем вставьте только ее структуру обратно в базу данных с другим именем (т. Е. «YourTable_new»).

  2. Измените поля в новой таблице на те, которые вы хотите, и сохраните.

  3. Создайте запрос на добавление и скопируйте все данные из вашей старой таблицы в новую.

Надеемся, что Access автоматически преобразует старое текстовое поле непосредственно в правильное значение для нового поля даты / времени. Если нет, вам, возможно, придется очистить старую таблицу и заново добавить все данные и использовать функцию преобразования строки в дату для преобразования этого поля при добавлении.

Кроме того, если в старой таблице есть поле автонумерации, это может не сработать, поскольку нет способа гарантировать, что старые значения автонумера будут совпадать с новыми назначенными значениями автонумера

0 голосов
/ 12 марта 2010

Предполагая, что сообщение об ошибке является точным, вы столкнулись с ограничением диска или памяти. Предполагая, что на вашем жестком диске свободно более пары гигабайт, я думаю, что при восстановлении таблицы база данных (включая рабочее пространство) превысит ограничение в 2 гигабайта на файл в Access.

Если это так, вам нужно:

  1. Выгрузите данные в некоторый удобный формат и загрузите их обратно в пустую базу данных с уже существующим определением таблицы.

  2. Переместите подмножество данных в меньшую таблицу, измените тип данных в меньшей таблице, сожмите и исправьте базу данных и повторяйте, пока все данные не будут преобразованы.

Если сообщение об ошибке НЕ является правильным (что возможно), наиболее вероятной причиной является неверная или недопустимая дата в столбце текстовой даты.

0 голосов
/ 12 марта 2010

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

Я бы предложил (и вы можете меня за это ненавидеть) экспортировать все эти предполагаемые значения дат из «Большой» и просмотреть их (возможно, в Excel), чтобы увидеть, какие из них не отформатированы так, как вы ожидаете.

...