Использование vbscript для запуска функции в ms access 2007 [duplicate]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
5
задан Cristian Ciupitu 21 September 2014 в 19:25
поделиться

7 ответов

У меня недостаточно ответов, чтобы ответить на предыдущий «ответ», но я хотел предоставить некоторую информацию, которая может быть полезной кому-то еще в отношении вопроса OP.

Я был используя метод JRO в течение многих лет, чтобы скомпилировать / восстановить базы данных Access 2000 с VB.net. Каждый раз в синей луне у меня есть клиент, которому удалось повредить базу данных (обычно при подключении к базе данных по сети и их непредвиденное прерывание сети). JRO (по моему опыту) отлично работает, пока база данных НЕ КОРРУПЦИЯ. Я никогда не мог понять, почему база данных МОЖЕТ ремонтироваться, если я использую приложение Access для ее выполнения, но при использовании MY-приложения (которое использует JRO) компакт-диск / ремонт всегда терпит неудачу (база данных находится в нераспознанном формате).

Итак, после того, как я обратился к этой теме всего час назад, я отбросил ссылку на DAO в свое приложение и опробовал ее способность исправлять поврежденную базу данных, поскольку я только что сегодня заразил клиента своей базой данных (в третий раз произошло примерно через 8 лет). Угадайте, DAO смог восстановить базу данных, когда JRO не удалось!

Хорошо, так что это мой опыт работы с JRO против DAO. Надеюсь, поможет. Вот фрагмент примера кода для использования CompactDatabase из DAO:

Dim dbCorrupt As String = "c:\CorruptedDB.mdb"
Dim dbRepaired As String = Path.Combine(Path.GetDirectoryName(dbPath), Path.GetFileNameWithoutExtension(dbPath) & "_Repaired.mdb")

Dim dao As New dao.DBEngine
dao.CompactDatabase(dbCorrupt, dbRepaired)
7
ответ дан Cristian Ciupitu 18 August 2018 в 04:33
поделиться

невозможное уплотнение и восстановление базы данных MS ACCESS двумя способами:

  • с использованием DAO: в DAO350 существует метод RepairDatabase(), тогда как в DAO360 есть CompactDatabase()
  • , используя MDAC + JRO:

В качестве примера, в VB6 (старый, старый, старый ...) выполните следующее:

Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db_to_repair.mdb;Jet OLEDB:Database Password=mypass", _ 
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\repaired_db.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=mypass"

Как вы что функция требует, чтобы вы указали имя восстанавливаемой базы данных и имя восстановленной базы данных.

3
ответ дан Andrea Monelli 18 August 2018 в 04:33
поделиться
  • 1
    Думаю, DAO лучше JRO. – Fionnuala 18 August 2010 в 23:08
  • 2
    Привет, Рему, я боюсь, что не могу дать информированное мнение об этом, вы знаете, я использовал оба, но я никогда не углублялся в эти технологии. – Andrea Monelli 18 August 2010 в 23:37
  • 3
    Ремонт был удален из Jet 3.51, c. 1997. Никогда не следует использовать ничего, кроме Compact. – David-W-Fenton 19 August 2010 в 18:43

Это решение работает с механизмом базы данных Access 2010:

Необходимая ссылка:

Microsoft.Office.interop.access.dao

Код:

public void CompactDb(
    string sourceFilePath, string destFilePath, string password)
{
    var dbEngine = new Microsoft.Office.Interop.Access.Dao.DBEngine();

    dbEngine.CompactDatabase(sourceFilePath, destFilePath,
        ";pwd=" + password, null, ";pwd=" + password);
}

(Исходные файлы и файлы destFilePath не должны быть одинаковыми!) [/ ​​g3]

Параметры метода CompactDatabase (от отражения):

void CompactDatabase(
    string SrcName, string DstName,
    object DstLocale = Type.Missing,
    object Options = Type.Missing,
    object SrcLocale = Type.Missing);

Убедитесь, что вы запустили его на той же платформе, что и AccessDatabaseEngine (или Office) (x86 / x64).

1
ответ дан Danny Varod 18 August 2018 в 04:33
поделиться

Пример кода для VBScript.

Dim objEngine
Dim objProcess
'Dim objDB
Dim strDb1

Dim strPath
Dim strFile
Dim strDAOversion
Dim strApplicationName
Dim strErr

Dim strMsg
Dim FSO

strPath = "C:\Docs\"

strFile = "Some.mdb"
strDb1 = strPath & strFile

Set FSO=CreateObject("Scripting.FileSystemObject")

strDAOversion = "DAO.DBEngine.36"
strApplicationName = "Some.mdb"

strMsg = "About to perform a COMPACT on "
strMsg = strMsg & chr(10) & chr(10)
strmsg = strMsg & strApplicationName
strMsg = strMsg & chr(10) & chr(10)
strmsg = strmsg & "Please ask everyone to EXIT THE SYSTEM."
strMsg = strmsg & chr(10) & chr(10)
strmsg = strmsg & space(12) & "It is VITAL you do not exit windows until"
strMsg = strMsg & chr(10)
strMsg = strMsg & space(12) & "you receive the confirmation message."
strMsg = strmsg & chr(10) & chr(10)
strMsg = strMsg & space(6) & "Press OK to continue or Cancel to stop the process."


If MsgBox(strMsg, 1, strApplicationName) = 1 Then

  Set objEngine = WScript.CreateObject(strDAOversion)

  Call CompactDB(FSO, objEngine, strDb1, "password")

  If strErr="True" Then
    strMsg = "Please correct the problem and try again."
    MsgBox strMsg, 1, strApplicationName
  Else
    strMsg = "Database compacting complete."
    MsgBox strMsg, 1, strApplicationName
  End If
End If


Function CompactDB(objFSO, objEngine, strDb, pwd)

'Compact the database

Dim strdbtemp
Dim MsgText

strdbtemp = Left(strDb, Len(strDb) - 3) & "ldb"

If FSO.FileExists(strdbtemp) = True Then 'if ldb file exists, db is still open.
MsgText = "You have not exited the file. Please close and try again."
MsgBox MsgText, 1, strApplicationName
strErr="True"
Exit Function
End If

If FSO.FileExists(strDb1) = False Then
MsgText = "Cannot locate the database at " & strDB
MsgBox MsgText, 1, strApplicationName
strErr="True"
Exit Function
End If

strdbtemp = Left(strDb, Len(strDb) - 3) & "tmp"

If pwd = "" Then
objEngine.CompactDatabase strDb, strdbtemp
Else
objEngine.CompactDatabase strDb, strdbtemp, , , ";pwd=" & pwd
End If

If Err = 0 Then
FSO.deletefile strDb
FSO.copyfile strdbtemp,strDb
FSO.deletefile strdbtemp
Else
MsgText = "Error during COMPACT process for " & strDB
MsgBox MsgText, 1, strApplicationName
strErr="True"
End If

End Function
2
ответ дан Fionnuala 18 August 2018 в 04:33
поделиться
  • 1
    Есть одна проблема с этим кодом, который я вижу с летучей мыши, и это то, что вы проверяете наличие LDB, чтобы узнать, открыт ли MDB, и LDB может сохраняться даже тогда, когда MDB не открыт. Чтобы действительно увидеть, открыт ли MDB, вы должны попытаться удалить LDB, и если это не удастся, MDB будет открыт. – David-W-Fenton 19 August 2010 в 18:46
  • 2
    BTW, я написал сценарий для этого в понедельник, чтобы выполнять запланированную задачу на сервере. Вместо ящиков сообщений я зарегистрировал все. Но мой код не так хорош, как ваш. – David-W-Fenton 19 August 2010 в 18:46
  • 3
    Я довольно уверен, что не могу взять на себя ответственность за большую часть этого, но у меня это было хорошо, поэтому я не могу назначить кредит для соответствующих частей. – Fionnuala 19 August 2010 в 21:09
  • 4
    strErr не назначается ничего, кроме "True" поэтому он должен быть действительно логическим, если он используется для поразрядных сравнений. – Tom 'Blue' Piddock 22 April 2013 в 08:13
  • 5
    Ах я вижу! Таким образом, VBSCript невероятно слаб, когда набрал тогда :) Возможно, вместо использования "True" было бы лучше использовать его как true, я считаю, что логическое назначение должно работать, даже если вы не можете сильно набрать объект. boolErr = true – Tom 'Blue' Piddock 22 April 2013 в 08:52

Вот официальная ссылка MS, любые дальнейшие комментарии будут излишними. Метод DBEngine.CompactDatabase

0
ответ дан htm11h 18 August 2018 в 04:33
поделиться

Это всего четыре строки кода в c # .net

Сначала используйте библиотеку:

using JRO;

Вы хотите сжать и восстановить test.mdb со следующим кодом:

string currentdirectory = System.IO.Directory.GetCurrentDirectory();
string oldmdbfile = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + currentdirectory + "\\test.mdb;Jet OLEDB:Database Password='xyz'";
string newmdbfile = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + currentdirectory + "\\test1.mdb;Jet OLEDB:Database Password='xyz'";
string oldmdbfilepath = currentdirectory + "\\test.mdb";
string newmdbfilepath = currentdirectory + "\\test1.mdb";

JRO.JetEngine engine = new JetEngine();
engine.CompactDatabase(oldmdbfile, newmdbfile);
File.Delete(oldmdbfilepath);
File.Move(newmdbfilepath, oldmdbfilepath);
MessageBox.Show("Database compact and repaired successfully !",);

Таким образом, test.mdb будет уплотняться и восстанавливаться, и будет создан новый файл test1.mdb. Затем вам просто нужно удалить test.mdb и переименовать test1.mdb в test.mdb.

3
ответ дан Martijn Pieters 18 August 2018 в 04:33
поделиться

Добавить ref в: Объекты данных Microsoft ActiveX 2.x Библиотека Microsoft Jet и объекты репликации 2.x Library

sDB = "c:\DB\myDb.mdb"
sDBtmp = "c:\DB\tempMyDb.mdb"
sPASSWORD = "password"

Dim oApp As Access.Application
Set oApp = New Access.Application
Call oApp.DBEngine.CompactDatabase(sDB, sDBtmp, dbLangGeneral, , ";pwd=" & sPASSWORD)

'wait for the app to finish
        DoEvents
'remove the uncompressed original
        Kill sDB
'rename the compressed file to the original to restore for other functions
        Name sDBtmp As sDB
0
ответ дан Sandeep 18 August 2018 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: