Превышено число блокировок общего доступа к файлам, ошибка выполнения 3052 - PullRequest
1 голос
/ 12 сентября 2011

Хорошо, у меня есть макрос, который входит и проверяет таблицу, чтобы определить формат приложения, установленного пользователем. Если для этого формата задан европейский формат, он запускает функцию, которая просматривает таблицу и меняет форматирование даты с ММ / дд / гггг на дд / мм / гггг. кажется, все настроено правильно, и когда форматирование выполняется в США, макрос работает правильно (что следует учитывать, если он пропустит эту строку, если форматирование не установлено на европейский.) Однако, когда форматирование установлено на европейский, я получаю это выскакивающая ошибка во время выполнения:

    Run-Time error '3052':
File sharing lock count exceeded. Increase MaxLocksPerFile registry entry.

Теперь я всегда осторожен, когда получаю ошибку, в которой говорится, что исправление заключается в изменении чего-либо в реестре. Не говоря уже о том, что я бы не хотел, чтобы клиент делал это только для того, чтобы приложение работало. Однако я дал ему шанс, чтобы посмотреть, действительно ли это решит проблему, выполнив эти шаги. Хотя, когда я изменил MaxLocksPerFile по умолчанию с его значения по умолчанию (9500) на (30 000) и снова запустил макрос, я все равно получил ту же ошибку при чуть большем числе.

Прежде чем я получу сообщение об ошибке после прохождения примерно 12 000 строк, после изменения должно появиться около 15 0000 строк.

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

Это мой код ниже:

    Public Function UKDateFormat() As Variant
Dim varPieces As Variant
Dim strNew As String
Dim varReturn As Variant
Dim Strsql As String
Dim db As dao.Database
Dim rstAlarmdetDateMod As dao.Recordset
Dim i As Long

Set db = CurrentDb()

Strsql = "select AlarmDate From AlarmdetDateMods;"
Set rstAlarmdetDateMod = db.OpenRecordset(Strsql, dbOpenDynaset)

If (rstAlarmdetDateMod.RecordCount > 0) Then
    rstAlarmdetDateMod.MoveFirst

i = 0


    While (rstAlarmdetDateMod.EOF) = False
    i = i + 1
       rstAlarmdetDateMod.Edit
       rstAlarmdetDateMod![alarmdate] = CDate(Format(rstAlarmdetDateMod![alarmdate], "dd/MM/yyyy"))
       rstAlarmdetDateMod.Update
       rstAlarmdetDateMod.MoveNext
    Wend
End If
rstAlarmdetDateMod.Close
db.Close


End Function

Это мой запрос на обновление:

UPDATE DISTINCTROW AlarmdetDateMods SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));

Что я хотел бы знать: что именно я делаю неправильно с моей функцией, что она вызывает эту ошибку, и как я могу исправить ее таким образом, чтобы мне не пришлось вдаваться и изменять реестр, чтобы эта функция работала?

Любая помощь или предложения с благодарностью. Благодаря.

1 Ответ

1 голос
/ 12 сентября 2011

В дополнение к вашей функции UKDateFormat вы показали нам этот оператор UPDATE.

UPDATE DISTINCTROW AlarmdetDateMods
SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));

Однако не совсем понятно, что с этим происходит.Это работает?Сбой с той же ошибкой, что и функция UKDateFormat?Другая ошибка?

Попробуйте пересмотренный оператор UPDATE.Я думаю, что DISTINCTROW не полезен в этом случае;предлагаю вам отказаться от него.

Кроме того, ваш UPDATE полагается на неявные преобразования типов данных.AlarmDate - это текстовое значение.Вы передаете этот текст в функцию Format (), чтобы обработать его как значение даты / времени и преобразовать его в другую форматированную строку.Затем вы просите CDate () преобразовать это строковое значение в значение даты / времени.Наконец, значение даты / времени сохраняется в текстовом поле AlarmDate.

Как минимум, я бы не стал приводить отформатированную строку обратно к значению даты / времени перед сохранением ее в текстовом поле.Однако я бы также сделал преобразования типов данных явными, а не неявными.И ограничивайте попытку UPDATE только теми строками, где AlarmDate содержит текстовое представление действительного значения даты / времени.

UPDATE AlarmdetDateMods
SET AlarmDate = Format(CDate(AlarmDate),"dd/mm/yyyy")
WHERE IsDate(AlarmDate) = True;

Обратите внимание, что это предложение предполагает изменение всех ваших сохраненных текстовых значений AlarmDate, является разумным.У меня есть сомнения по этому поводу.Похоже, что AlarmDate должен быть Дата / Время, а не текст.А если вам нужно изменить формат при отображении этих значений даты / времени, сделайте это с помощью свойства format связанного элемента управления в форме или с помощью функции Format () в запросе.

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