הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
מתקדם: דורש מיומנויות קידוד, יכולת פעולה הדדית ומיומנויות מרובות משתמשים.
מאמר זה חל רק על מסד נתונים של Microsoft Access (.mdb).
מאפייני הבעיה
בעת ביצוע פעולה בטבלה, ייתכן שתקבל את הודעת השגיאה הבאה אם הפעולה יוצרת מספר גדול של נעילות עמודים: אין די שטח דיסק או זיכרון.
אם אתה מפעיל שאילתת פעולה בטבלה גדולה, ייתכן שתקבל את הודעת השגיאה הבאה: אין די שטח דיסק או זיכרון לביטול שינויי הנתונים שהשאילתת פעולה זו צפויה לבצע.
סיבה
נעילות העמוד הנדרשות עבור הטרנזקציה חורגות מהערך MaxLocksPerFile, המוגדר כברירת מחדל ל- 9500 נעילות. MaxLocksPerFilesetting מאוחסן ברישום של Windows.
פתרון
חשוב
המקטע, השיטה או המשימה הזו מכילה שלבים שמפרטים כיצד לשנות את הרישום. עם זאת, אם תשנה את הרישום באופן שגוי עלולות להתרחש בעיות חמורות. לכן הקפד לבצע פעולות אלה בזהירות. לתוספת הגנה, גבה את הרישום לפני שתשנה אותו. כך, אם תתרחש בעיה תוכל לשחזר את הרישום. לקבלת מידע נוסף אודות אופן גיבוי, שחזור ושינוי של רישום, עיינו בכיצד לגבות ולשחזר רישום ב- Windows.
קיימות כמה דרכים לעקוף בעיה זו:
- באפשרותך להשתמש ב- Regedit.exe לערוך את הרישום ולשנות את MaxLocksPerFilevalue לצמיתות.
- באפשרותך להשתמש ב- SetOptionmethod של האובייקט DBEngine כדי לשנות את MaxLocksPerFilevalue באופן זמני בקוד.
- אם השגיאה מתרחשת בעת הפעלת שאילתת פעולה, באפשרותך לשנות את השאילתה ולהגדיר את UseTransactionproperty שלה ללא.
שיטה 1: שינוי MaxLocksPerFile ברישום
השתמש בעורך הרישום כדי להגדיל את הערך MaxLocksPerFile תחת המפתח הבא:
עבור Microsoft Access 2000, ב- Microsoft Access 2002 וב- Microsoft Office Access 2003 הפועלים במערכת הפעלה של Windows של 32 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet חוות דעת 4.0
עבור Microsoft Access 2000, ב- Microsoft Access 2002 וב- Microsoft Office Access 2003 הפועלים במערכת הפעלה של Windows של 64 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet חוות דעת 4.0
עבור Microsoft Office Access 2007 הפועל במערכת הפעלה של Windows של 32 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Office Access 2007 הפועל במערכת הפעלה של Windows של 64 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Access 2010 הפועל במערכת הפעלה של Windows של 32 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Office Access 2010 הפועל במערכת הפעלה של Windows של 64 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Access 2013 הפועל במערכת הפעלה של Windows של 32 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Office Access 2013 הפועל במערכת הפעלה Windows של 64 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Access 2016 הפועל במערכת הפעלה של Windows של 32 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE
עבור Microsoft Office Access 2016 הפועל במערכת הפעלה של Windows של 64 סיביות:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE
שים לב ששיטה זו משנה את הגדרת הרישום עבור כל היישומים המשתמשים במנגנון מסד הנתונים של Microsoft Jet גירסה 4.0.
שיטה 2: שימוש ב- SetOption לשינוי MaxLocksPerFile באופן זמני
הערה
הקוד לדוגמה במאמר זה משתמש באובייקטי גישה לנתונים של Microsoft. כדי שקוד זה יפעל כראוי, עליך להפנות לספריית האובייקטים של Microsoft DAO 3.6. לשם כך, בחר הפניות בתפריט כלים בעורך Visual Basic וודא שתיבת הסימון ספריית אובייקטים של Microsoft DAO 3.6 נבחרה.
Microsoft מספקת דוגמאות תיכנות לאיור בלבד, ללא אחריות, מפורשת או משתמעת. הדבר כולל, אך אינו מוגבל, לאחריות המשתמעת של חירות או התאמה למטרה מסוימת. מאמר זה מבוסס על ההנחה שאתה מכיר את שפת התיכנות המודגמת, עם הכלים המשמשים ליצירה ול איתור באגים בהליכים. מהנדסי התמיכה של Microsoft יכולים לעזור להסביר את הפונקציונליות של הליך מסוים, אך הם לא יוכלו לשנות דוגמאות אלה כדי לספק פונקציונליות נוספת או לבנות פרוצדורות שיסייעו לך לעמוד בדרישות הספציפיות שלך. פעולת SetOption
השירות עוקפת באופן זמני ערכים עבור מפתחות מנגנון מסד הנתונים של Microsoft Jet ברישום. הערך החדש נשאר בתוקף עד לשינויו שוב, או עד לסגירה של האובייקט DBEngine.
הערה
שינויים שבוצעו ב- MaxLocksPerFilesetting SetOption
באמצעות פעולת השירות זמינים רק באמצעות ההפעלה הנוכחית של אובייקטי גישה לנתונים (DAO). שאילתות שיפעלו דרך ממשק המשתמש של Microsoft Access עדיין משתמשות בהגדרות ברישום.
דוגמת הקוד הבאה מגדירה את MaxLocksPerFile ל- 200,000 לפני ביצוע פעולת עדכון בתוך טרנזקציה:
Sub LargeUpdate()
On Error GoTo LargeUpdate_Error
Dim db As DAO.Database, ws As DAO.Workspace
' Set MaxLocksPerFile.
DBEngine.SetOption dbMaxLocksPerFile, 200000
Set db = CurrentDb
Set ws = Workspaces(0)
' Perform the update.
ws.BeginTrans
db.Execute "UPDATE BigTable SET Field1 = 'Updated Field'", _
dbFailOnError
ws.CommitTrans
db.Close
MsgBox "Done!"
Exit Sub
LargeUpdate_Error:
MsgBox Err & " " & Error
ws.Rollback
MsgBox "Operation Failed - Update Canceled"
End Sub
שיטה 3: הגדרת המאפיין UseTransaction בשאילתת פעולה
אם שאילתת פעולה מאוחסנת גורמת לשגיאה, באפשרותך להגדיר את המאפיין UseTransaction
שלה ללא.
הערה: אם תעשה זאת, לא תוכל לחזור למצב הקודם אם קיימת בעיה או שגיאה בזמן שהשאילתה פועלת.
- פתח את השאילתה בתצוגת עיצוב.
- בתפריט תצוגה, בחר מאפיינים.
- בחר שטח ריק במחצית העליונה של חלון השאילתה כדי להציג את תיבת הדו-שיח מאפייני שאילתה.
- הגדר את UseTransactionproperty ל'לא'.
- שמור את השאילתה וסגור אותה.
מידע נוסף
הרישום MaxLocksPerFilesetting
מונע מטרנזקציות במנגנון מסד הנתונים של Microsoft Jet לחרוג מערך שצוין. אם טרנזקציה מנסה ליצור נעילות מעל הערך MaxLocksPerFile, הטרנזקציה מפוצלת לשני חלקים או יותר ומחויבת באופן חלקי.
שלבים לשכפול הבעיה
הדוגמה הבאה משתמשת בפרוצדורת Visual Basic כדי ליצור טבלה הכוללת 10,000 רשומות ולאחר מכן משנה את הטבלה כדי לגרום לה הודעת השגיאה:
- פתח את מסד הנתונים לדוגמה Northwind.mdb.
- צור מודול ולאחר מכן הקלד את ההליך הבא:
Sub CreateBigTable()
Dim db As Database, rs As Recordset
Dim iCounter As Integer, strChar As String
Set db = CurrentDb
db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
"Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
dbFailOnError
Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
iCounter = 0
strChar = String(255, " ")
While iCounter <= 10000
rs.AddNew
rs!ID = iCounter
rs!Field1 = strChar
rs!Field2 = strChar
rs!Field3 = strChar
rs!Field4 = strChar
rs.Update
iCounter = iCounter + 1
Wend
MsgBox "Done!"
End Sub
כדי להפעיל את ההליך, הקלד את השורה הבאה בחלון Immediate ולאחר מכן הקש ENTER:
CreateBigTable
ההליך יוצר טבלה בשם BigTable עם 10,000 רשומות.
שמור את המודול כמודול1 ולאחר מכן סגור אותו.
פתח את טבלת BigTable בתצוגת עיצוב.
שנה את ה- FieldSizeproperty של Field4 ל- 253.
שמור את הטבלה. לחץ על כן כשתתבקש שייתכן שחלק מהנתונים יאבדו.
שים לב שלאחר זמן מה, אתה מקבל את הודעות השגיאה הבאות:
Microsoft Access can't change the data type. There isn't enough disk space or memory.
Errors were encountered during the save operation. Data types were not changed. Properties were not updated.