Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podsumowanie
W tym artykule pokazano, jak zautomatyzować Microsoft Access przy użyciu programu Microsoft Visual C# 2005 lub microsoft Visual C# .NET. Tematy i przykładowy kod pokazują, jak wykonać następujące czynności:
- Otwórz bazę danych w programie Access.
- Drukowanie lub wyświetlanie podglądu raportu programu Access.
- Pokaż i edytuj formularz programu Access.
- Unikaj okien dialogowych po otwarciu bazy danych chronionej hasłem lub w przypadku włączenia zabezpieczeń na poziomie użytkownika.
- Automatyzowanie środowiska uruchomieniowego dostępu.
Automatyzacja a ADO.NET
Deweloper może pracować z bazą danych Microsoft Access z programu Visual C# 2005 lub Visual C# .NET przy użyciu dwóch oddzielnych technologii: Automation i Microsoft ADO.NET.
ADO.NET jest preferowaną technologią, jeśli chcesz pracować z obiektami danych, takimi jak tabele i zapytania w bazie danych programu Access. Usługa Automation jest używana tylko wtedy, gdy potrzebujesz Microsoft Access funkcji specyficznych dla aplikacji, takich jak możliwość drukowania lub wyświetlania podglądu raportu programu Access, wyświetlania formularza dostępu lub wywoływania makr programu Access.
W tym artykule omówiono sposób automatyzowania dostępu. W artykule nie omówiono ADO.NET. Aby uzyskać informacje dotyczące ADO.NET, kliknij poniższe numery artykułów, aby wyświetlić artykuły w bazie wiedzy Microsoft Knowledge Base:
306636 How to connect to a database and run a command by using ADO 2005 and Visual C# 2005 or by using ADO.NET and Visual C# .NET
314145 Jak wypełnić obiekt DataSet z bazy danych przy użyciu programu Visual C# .NET
307587 Jak zaktualizować bazę danych z obiektu DataSet przy użyciu programu Visual C# 2005 lub Visual C# .NET
Automatyzacja to technologia modelu obiektów składników (COM). Automatyzacja umożliwia aplikacjom napisanym w językach takich jak Visual C# .NET programowe sterowanie innymi aplikacjami. Podczas automatyzowania aplikacji pakietu Microsoft Office faktycznie uruchamiasz wystąpienie tej aplikacji w pamięci, a następnie wywołujesz model obiektów aplikacji, aby wykonywać różne zadania w tej aplikacji. W przypadku programu Access i innych aplikacji pakietu Microsoft Office praktycznie wszystkie akcje, które można wykonać ręcznie za pośrednictwem interfejsu użytkownika, mogą być również wykonywane programowo przy użyciu usługi Automation.
Program Access uwidacznia tę funkcję programową za pośrednictwem modelu obiektów. Model obiektów jest kolekcją klas i metod, które służą jako odpowiedniki składników logicznych programu Access. Aby uzyskać dostęp do modelu obiektów z programu Visual C# .NET, można ustawić odwołanie do projektu do biblioteki typów.
Typowe zadania automatyzacji
Otwieranie bazy danych w programie Access
Podczas automatyzowania Microsoft Access należy otworzyć bazę danych przed wykonaniem przydatnych zadań, takich jak drukowanie raportów. Aby otworzyć bazę danych w wystąpieniu zautomatyzowanego dostępu, należy użyć metod OpenCurrentDatabase lub OpenAccessProject obiektu Application. W programie Access można jednocześnie otworzyć tylko jedną bazę danych. Aby pracować z inną bazą danych, przed otwarciem innej bazy danych można użyć metody CloseCurrentDatabase.
Możesz również użyć metody System.Runtime.InteropServices.Marshal.BindToMoniker(<ścieżka do bazy danych>), aby otworzyć bazę danych w wystąpieniu programu Access. Jeśli baza danych jest już otwarta w wystąpieniu programu Access, funkcja BindToMoniker zwraca obiekt Application tego wystąpienia. W przeciwnym razie bindtomoniker uruchamia nowe wystąpienie programu Access i otwiera określoną bazę danych.
OpenCurrentDatabase jest preferowaną metodą otwierania bazy danych, ponieważ określasz wystąpienie zautomatyzowanego dostępu. Możesz również podać argumenty umożliwiające kontrolowanie sposobu otwarcia bazy danych, na przykład:
Access.Application oAccess = null;
// Start a new instance of Access for Automation:
oAccess = new Access.ApplicationClass();
// Open a database in exclusive mode:
oAccess.OpenCurrentDatabase(
"c:\\mydb.mdb", //filepath
true //Exclusive
);
Drukowanie lub wyświetlanie podglądu raportu dostępu
Aby wyświetlić podgląd lub wydrukować raport programu Access, należy wywołać metodę OpenReport obiektu DoCmd. W przypadku wywołania polecenia OpenReport jeden z przekazanych argumentów określa, czy raport jest wyświetlany na ekranie w wersji zapoznawczej, czy jest wysyłany do drukarki:
// Preview a report named Sales:
oAccess.DoCmd.OpenReport(
"Sales", //ReportName
Access.AcView.acViewPreview, //View
System.Reflection.Missing.Value, //FilterName
System.Reflection.Missing.Value //WhereCondition
);
// Print a report named Sales:
oAccess.DoCmd.OpenReport(
"Sales", //ReportName
Access.AcView.acViewNormal, //View
System.Reflection.Missing.Value, //FilterName
System.Reflection.Missing.Value //WhereCondition
);
Zwróć uwagę, że argument Widok określa, czy raport jest wyświetlany w programie Access, czy jest wysyłany do drukarki. Argument WhereCondition może ograniczyć zestaw rekordów raportu, jeśli używasz prawidłowej klauzuli SQL WHERE (bez słowa WHERE). Zwróć uwagę, że możesz użyć elementu System.Reflection.Missing.Value, aby pominąć dowolne parametry obiektu, które są opcjonalne.
W przypadku podglądu raportu należy ustawić właściwość Visible obiektu Application, aby program Access był widoczny na ekranie. W ten sposób użytkownik może wyświetlić raport w oknie Dostęp.
Istnieje inny sposób drukowania raportu lub innych obiektów w bazie danych. Użyj metody PrintOut obiektu DoCmd. W tym przykładzie wybierzesz raport o nazwie Employees w oknie Baza danych, a następnie wywołasz polecenie PrintOut, aby wydrukować wybrany obiekt. Metoda PrintOut umożliwia podanie argumentów odpowiadających oknie dialogowym Drukowanie w programie Access:
// Select the Employees report in the database window:
oAccess.DoCmd.SelectObject(
Access.AcObjectType.acReport, //ObjectType
"Employees", //ObjectName
true //InDatabaseWindow
);
// Print 2 copies of the selected object:
oAccess.DoCmd.PrintOut(
Access.AcPrintRange.acPrintAll, //PrintRange
System.Reflection.Missing.Value, //PageFrom
System.Reflection.Missing.Value, //PageTo
Access.AcPrintQuality.acHigh, //PrintQuality
2, //Copies
false //CollateCopies
);
W niektórych przypadkach możesz też użyć metod OpenReport i PrintOut, aby wydrukować raport. Załóżmy, że chcesz wydrukować wiele kopii raportu Pracownicy, ale tylko dla określonego pracownika. W tym przykładzie najpierw jest używany raport OpenReport, aby otworzyć raport Employees w trybie podglądu, używając argumentu WhereCondition, aby ograniczyć rekordy do określonego pracownika. Następnie funkcja PrintOut służy do drukowania wielu kopii aktywnego obiektu:
// Open the report in preview mode using a WhereCondition:
oAccess.DoCmd.OpenReport(
"Employees", //ReportName
Access.AcView.acViewPreview, //View
System.Reflection.Missing.Value, //FilterName
"[EmployeeID]=1" //WhereCondition
);
// Print 2 copies of the active object:
oAccess.DoCmd.PrintOut(
Access.AcPrintRange.acPrintAll, //PrintRange
System.Reflection.Missing.Value, //PageFrom
System.Reflection.Missing.Value, //PageTo
Access.AcPrintQuality.acHigh, //PrintQuality
2, //Copies
false //CollateCopies
);
// Close the report preview window:
oAccess.DoCmd.Close(
Access.AcObjectType.acReport, //ObjectType
"Employees", //ObjectName
Access.AcCloseSave.acSaveNo //Save
);
Program Access 2002 wprowadził obiekt Drukarka. Ten obiekt umożliwia łatwiejsze dostosowywanie ustawień drukarki programu Access niż we wcześniejszych wersjach programu Access. Aby uzyskać przykład użycia obiektu Drukarka w programie Access do drukowania raportu, kliknij poniższy numer artykułu, aby wyświetlić artykuł w bazie wiedzy Microsoft Knowledge Base:
284286 Jak zresetować zmiany do obiektu Application.Printer
Pokaż i Edytuj formularz dostępu
Platforma .NET w języku Visual C# ma bardzo zaawansowane możliwości formularzy. Mogą jednak wystąpić sytuacje, w których użytkownik ma wyświetlić formularz, który został wcześniej opracowany w programie Access. Możesz też mieć formularz w bazie danych programu Access, który zawiera kryteria zapytania lub raportu, i musisz otworzyć ten formularz, zanim będzie można wyświetlić podgląd lub wydrukować raport. Aby otworzyć i wyświetlić formularz programu Access, należy wywołać metodę OpenForm obiektu DoCmd:
// Show a form named Employees:
oAccess.DoCmd.OpenForm(
"Employees", //FormName
Access.AcFormView.acNormal, //View
System.Reflection.Missing.Value, //FilterName
System.Reflection.Missing.Value, //WhereCondition
Access.AcFormOpenDataMode.acFormPropertySettings, //DataMode
Access.AcWindowMode.acWindowNormal, //WindowMode
System.Reflection.Missing.Value //OpenArgs
);
Możesz teraz edytować kontrolki w formularzu.
Okna dialogowe Zabezpieczenia dostępu
Podczas automatyzowania dostępu może zostać wyświetlony monit o wprowadzenie nazwy użytkownika, hasła lub obu tych elementów podczas próby otwarcia bazy danych. Jeśli użytkownik wprowadzi nieprawidłowe informacje, w kodzie wystąpi błąd. Mogą wystąpić czasy, gdy chcesz uniknąć tych okien dialogowych i zamiast tego programowo podać nazwę użytkownika i hasło, aby kod usługi Automation był uruchamiany nieprzerwanie.
Istnieją dwa typy zabezpieczeń w Microsoft Access: bazy danych chronione hasłem i zabezpieczenia na poziomie użytkownika za pośrednictwem pliku grupy roboczej (System.mdw). Jeśli próbujesz otworzyć bazę danych chronioną hasłem, zostanie wyświetlone okno dialogowe z monitem o hasło bazy danych. Zabezpieczenia na poziomie użytkownika różnią się od bazy danych chronionej hasłem. Po aktywowaniu zabezpieczeń na poziomie użytkownika program Access wyświetla okno dialogowe logowania z monitem o podanie nazwy użytkownika i hasła, zanim użytkownik będzie mógł otworzyć dowolną bazę danych w programie Access.
Unikanie okien dialogowych haseł bazy danych
Jeśli otwierasz bazę danych chronioną hasłem, możesz uniknąć okna dialogowego, podając hasło do metody OpenCurrentDatabase:
// Open a password-protected database in shared mode:
// Note: The bstrPassword argument is case-sensitive
oAccess.OpenCurrentDatabase(
"c:\\mydb.mdb", //filepath
false, //Exclusive
"MyPassword" //bstrPassword
);
Oto przykład, w którym funkcja oAccess została wcześniej ustawiona na wystąpienie programu Access, które nie ma otwartej bazy danych. Ten kod zawiera hasło do bazy danych, aby uniknąć okna dialogowego:
string sDBPassword = "MyPassword"; //database password
DAO._DBEngine oDBEngine = oAccess.DBEngine;
DAO.Database oDB = oDBEngine.OpenDatabase("c:\\mydb.mdb",
false, false, ";PWD=" + sDBPassword);
oAccess.OpenCurrentDatabase("c:\\mydb.mdb", false);
oDB.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oDB);
oDB = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oDBEngine);
oDBEngine = null;
Obiekt oDB.Close w rzeczywistości nie zamyka bazy danych w programie Access. Zamyka tylko połączenie dao z bazą danych utworzoną za pośrednictwem obiektu DBEngine. Połączenie dao nie jest już konieczne po użyciu metody OpenCurrentDatabase. Zwróć uwagę na kod zwalniania obiektów oDB i oDBEngine. Należy użyć tych obiektów, aby program Access został poprawnie zakończony po zakończeniu działania kodu.
Unikanie okien dialogowych logowania zabezpieczeń dostępu
Jeśli zabezpieczenia na poziomie użytkownika są włączone w programie Access, zostanie wyświetlone okno dialogowe logowania z monitem zarówno o nazwę użytkownika, jak i hasło. Nie można określić nazwy użytkownika i hasła przy użyciu modelu obiektów programu Access. W związku z tym, jeśli chcesz uniknąć okna dialogowego logowania podczas automatyzowania dostępu, musisz najpierw uruchomić plik Msaccess.exe i podać przełączniki wiersza polecenia /user i /pwd, aby określić nazwę użytkownika i hasło. Następnie możesz użyć polecenia GetActiveObject lub BindToMoniker, aby pobrać obiekt Application uruchomionego wystąpienia programu Access, aby umożliwić kontynuowanie pracy z usługą Automation.
Automatyzowanie środowiska uruchomieniowego dostępu
Wersja Microsoft Office Developer Edition zawiera narzędzia Microsoft Office Developer Tools (MOD). Korzystając z modu, deweloperzy programu Access mogą tworzyć i dystrybuować aplikacje programu Access do użytkowników, którzy nie mają wersji detalicznej programu Access. Gdy użytkownik instaluje aplikację programu Access na komputerze, który nie ma wersji detalicznej programu Access, jest zainstalowana wersja programu Access środowiska uruchomieniowego. Środowisko uruchomieniowe programu Access jest zainstalowane i jest zarejestrowane jak wersja detaliczna. Plik wykonywalny jest również nazywany Msaccess.exe. Środowisko uruchomieniowe programu Access umożliwia uruchamianie aplikacji programu Access na komputerze klienckim, ale środowisko uruchomieniowe programu Access nie zezwala użytkownikowi na tworzenie nowych aplikacji ani modyfikowanie projektu istniejących aplikacji.
Środowisko uruchomieniowe programu Access musi zostać uruchomione z bazą danych. Ze względu na to wymaganie, jeśli chcesz zautomatyzować środowisko uruchomieniowe programu Access, musisz uruchomić Msaccess.exe i określić bazę danych do otwarcia. Po pobraniu obiektu Application za pomocą polecenia GetActiveObject lub BindToMoniker można zautomatyzować środowisko uruchomieniowe programu Access. Jeśli nie używasz tego podejścia podczas próby zautomatyzowania środowiska Access Runtime, podczas próby utworzenia wystąpienia wystąpienia zostanie wyświetlony komunikat o błędzie, taki jak następujący:
Wykonanie serwera System.Runtime.InteropServices.COMException (0x80080005) nie powiodło się.
Tworzenie pełnego przykładowego projektu .NET w języku Visual C# 2005 lub Visual C#
Aby użyć poniższego przykładu krok po kroku, upewnij się, że zainstalowano przykładową bazę danych northwind. Domyślnie Microsoft Access 2000 instaluje przykładowe bazy danych w następującej ścieżce:
C:\Program Files\Microsoft Office\Office\Samples
Microsoft Access 2002 używa następującej ścieżki:
C:\Program Files\Microsoft Office\Office10\Samples
Program Microsoft Office Access 2003 używa następującej ścieżki:
C:\Program Files\Microsoft\Office\Office11\Samples
Aby upewnić się, że przykładowa baza danych northwind jest zainstalowana w programie Access 2002 lub w programie Access 2003, kliknij pozycję Przykładowe bazy danych w menu Pomoc, a następnie kliknij pozycję Przykładowa baza danych Northwind.
Zamknij wszystkie obecnie uruchomione wystąpienia programu Access.
Uruchom program Microsoft Visual Studio .NET.
W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Projekt. Wybierz pozycję Aplikacja systemu Windows z typów projektów języka Visual C#. Domyślnie tworzony jest formularz Form1.
Uwaga Musisz zmienić kod w programie Visual Studio 2005. Domyślnie program Visual C# dodaje jeden formularz do projektu podczas tworzenia projektu Windows Forms. Formularz nosi nazwę Form1. Dwa pliki reprezentujące formularz mają nazwy Form1.cs i Form1.designer.cs. Kod jest pisany w pliku Form1.cs. Plik Form1.designer.cs to miejsce, w którym projektant Windows Forms zapisuje kod implementujący wszystkie akcje wykonywane przez przeciąganie i usuwanie kontrolek z przybornika.
Aby uzyskać więcej informacji na temat projektanta Windows Forms w programie Visual C# 2005, odwiedź następującą witrynę sieci Web microsoft developer network (MSDN):https://msdn.microsoft.com/en-us/library/ms173077.aspx
Dodaj odwołanie do biblioteki obiektów Microsoft Access. Aby to zrobić, wykonaj następujące kroki.
- W menu Projekt kliknij pozycję Dodaj odwołanie.
- Na karcie COM znajdź bibliotekę obiektów Microsoft Access, a następnie kliknij pozycję Wybierz.
Uwaga W programie Visual Studio 2005. Nie musisz klikać przycisku Wybierz.
Uwaga Pakiet Microsoft Office 2003 obejmuje podstawowe zestawy międzyoperacyjności (PIA). Pakiet Microsoft Office XP nie zawiera identyfikatorów PIA, ale można je pobrać.
W oknie dialogowym Dodawanie odwołań kliknij przycisk OK, aby zaakceptować wybrane opcje.
Uwaga Jeśli odwołujesz się do biblioteki obiektów programu Access 10.0 i podczas próby dodania odwołania zostaną wyświetlone błędy.
W menu Widok kliknij pozycję Przybornik, aby wyświetlić przybornik.
Dodaj pięć kontrolek przycisków radiowych i jedną kontrolkę przycisku do formularza Form1.
Wybierz wszystkie kontrolki przycisku radiowego, a następnie ustaw właściwość Size na 150,24.
Dodaj programy obsługi zdarzeń dla zdarzenia Ładowania formularza i zdarzenia Kliknij kontrolki Przycisk:
W widoku projektu dla pliku Form1.cs kliknij dwukrotnie pozycję Formularz1.
Program obsługi zdarzenia Ładowania formularza jest tworzony i wyświetlany w pliku Form1.cs.
W menu Widok kliknij pozycję Projektant, aby przełączyć się do widoku projektu.
Kliknij dwukrotnie przycisk Button1.
Procedura obsługi zdarzenia Kliknięcie przycisku jest tworzona i wyświetlana w pliku Form1.cs.
W pliku Form1.cs zastąp następujący kod
private void Form1_Load(object sender, System.EventArgs e) { } private void button1_Click(object sender, System.EventArgs e) { }
Z:
private string msAction = null; // Commonly-used variable for optional arguments: private object moMissing = System.Reflection.Missing.Value; private void Form1_Load(object sender, System.EventArgs e) { radioButton1.Text = "Print report"; radioButton2.Text = "Preview report"; radioButton3.Text = "Show form"; radioButton4.Text = "Print report (Security)"; radioButton5.Text = "Preview report (Runtime)"; button1.Text = "Go!"; radioButton1.Click += new EventHandler(RadioButtons_Click); radioButton2.Click += new EventHandler(RadioButtons_Click); radioButton3.Click += new EventHandler(RadioButtons_Click); radioButton4.Click += new EventHandler(RadioButtons_Click); radioButton5.Click += new EventHandler(RadioButtons_Click); } private void RadioButtons_Click(object sender, System.EventArgs e) { RadioButton radioBtn = (RadioButton) sender; msAction = radioBtn.Text; } private void button1_Click(object sender, System.EventArgs e) { // Calls the associated procedure to automate Access, based // on the selected radio button on the form. switch(msAction) { case "Print report": Print_Report(); break; case "Preview report": Preview_Report(); break; case "Show form": Show_Form(); break; case "Print report (Security)": Print_Report_Security(); break; case "Preview report (Runtime)": Preview_Report_Runtime(); break; } } private void NAR(object o) { // Releases the Automation object. try // use try..catch in case o is not set { Marshal.ReleaseComObject(o); } catch{} } private Access.Application ShellGetDB(string sDBPath, string sCmdLine, ProcessWindowStyle enuWindowStyle, int iSleepTime) { //Launches a new instance of Access with a database (sDBPath) //using System.Diagnostics.Process.Start. Then, returns the //Application object via calling: BindToMoniker(sDBPath). Returns //the Application object of the new instance of Access, assuming that //sDBPath is not already opened in another instance of Access. To //ensure the Application object of the new instance is returned, make //sure sDBPath is not already opened in another instance of Access //before calling this function. // //Example: //Access.Application oAccess = null; //oAccess = ShellGetDB("c:\\mydb.mdb", null, // ProcessWindowStyle.Minimized, 1000); Access.Application oAccess = null; string sAccPath = null; //path to msaccess.exe Process p = null; // Enable exception handler: try { // Obtain the path to msaccess.exe: sAccPath = GetOfficeAppPath("Access.Application", "msaccess.exe"); if (sAccPath == null) { MessageBox.Show("Can't determine path to msaccess.exe"); return null; } // Make sure specified database (sDBPath) exists: if(!System.IO.File.Exists(sDBPath)) { MessageBox.Show("Can't find the file '" + sDBPath + "'"); return null; } // Start a new instance of Access passing sDBPath and sCmdLine: if(sCmdLine == null) sCmdLine = @"""" + sDBPath + @""""; else sCmdLine = @"""" + sDBPath + @"""" + " " + sCmdLine; ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = sAccPath; startInfo.Arguments = sCmdLine; startInfo.WindowStyle = enuWindowStyle; p = Process.Start(startInfo); p.WaitForInputIdle(60000); //max 1 minute wait for idle input state // Move focus back to this form. This ensures that Access // registers itself in the ROT: this.Activate(); // Pause before trying to get Application object: System.Threading.Thread.Sleep(iSleepTime); // Obtain Application object of the instance of Access // that has the database open: oAccess = (Access.Application) Marshal.BindToMoniker(sDBPath); return oAccess; } catch(Exception e) { MessageBox.Show(e.Message); // Try to quit Access due to an unexpected error: try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; return null; } } private Access.Application ShellGetApp(string sCmdLine, ProcessWindowStyle enuWindowStyle) { //Launches a new instance of Access using System.Diagnostics. //Process.Start then returns the Application object via calling: //GetActiveObject("Access.Application"). If an instance of //Access is already running before calling this function, //the function may return the Application object of a //previously running instance of Access. If this is not //desired, then make sure Access is not running before //calling this function, or use the ShellGetDB() //function instead. Approach based on Q316125. // //Examples: //Access.Application oAccess = null; //oAccess = ShellGetApp("/nostartup", // ProcessWindowStyle.Minimized); // //-or- // //Access.Application oAccess = null; //string sUser = "Admin"; //string sPwd = "mypassword"; //oAccess = ShellGetApp("/nostartup /user " + sUser + "/pwd " + sPwd, // ProcessWindowStyle.Minimized); Access.Application oAccess = null; string sAccPath = null; //path to msaccess.exe Process p = null; int iMaxTries = 20; //max GetActiveObject attempts before failing int iTries = 0; //GetActiveObject attempts made // Enable exception handler: try { // Obtain the path to msaccess.exe: sAccPath = GetOfficeAppPath("Access.Application", "msaccess.exe"); if(sAccPath == null) { MessageBox.Show("Can't determine path to msaccess.exe"); return null; } // Start a new instance of Access passing sCmdLine: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = sAccPath; startInfo.Arguments = sCmdLine; startInfo.WindowStyle = enuWindowStyle; p = Process.Start(startInfo); p.WaitForInputIdle(60000); //max 1 minute wait for idle input state // Move focus back to this form. This ensures that Access // registers itself in the ROT: this.Activate(); tryGetActiveObject: // Enable exception handler: try { // Attempt to use GetActiveObject to reference a running // instance of Access: oAccess = (Access.Application) Marshal.GetActiveObject("Access.Application"); } catch { //GetActiveObject may have failed because enough time has not //elapsed to find the running Office application. Wait 1/2 //second and retry the GetActiveObject. If you try iMaxTries //times and GetActiveObject still fails, assume some other //reason for GetActiveObject failing and exit the procedure. iTries++; if(iTries < iMaxTries) { System.Threading.Thread.Sleep(500); //wait 1/2 second this.Activate(); goto tryGetActiveObject; } MessageBox.Show("Unable to GetActiveObject after " + iTries + " tries."); return null; } // Return the Access Application object: return oAccess; } catch(Exception e) { MessageBox.Show(e.Message); // Try to quit Access due to an unexpected error: try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; return null; } } private string GetOfficeAppPath(string sProgId, string sEXE) { //Returns path of the Office application. e.g. //GetOfficeAppPath("Access.Application", "msaccess.exe") returns //full path to Microsoft Access. Approach based on Q240794. //Returns null if path not found in registry. // Enable exception handler: try { Microsoft.Win32.RegistryKey oReg = Microsoft.Win32.Registry.LocalMachine; Microsoft.Win32.RegistryKey oKey = null; string sCLSID = null; string sPath = null; int iPos = 0; // First, get the clsid from the progid from the registry key // HKEY_LOCAL_MACHINE\Software\Classes\<PROGID>\CLSID: oKey = oReg.OpenSubKey(@"Software\Classes\" + sProgId + @"\CLSID"); sCLSID = oKey.GetValue("").ToString(); oKey.Close(); // Now that we have the CLSID, locate the server path at // HKEY_LOCAL_MACHINE\Software\Classes\CLSID\ // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\LocalServer32: oKey = oReg.OpenSubKey(@"Software\Classes\CLSID\" + sCLSID + @"\LocalServer32"); sPath = oKey.GetValue("").ToString(); oKey.Close(); // Remove any characters beyond the exe name: iPos = sPath.ToUpper().IndexOf(sEXE.ToUpper()); // 0-based position sPath = sPath.Substring(0, iPos + sEXE.Length); return sPath.Trim(); } catch { return null; } } private void Print_Report() { // Prints the "Summary of Sales by Year" report in Northwind.mdb. Access.Application oAccess = null; string sDBPath = null; //path to Northwind.mdb string sReport = null; //name of report to print // Enable exception handler: try { sReport = "Summary of Sales by Year"; // Start a new instance of Access for Automation: oAccess = new Access.ApplicationClass(); // Determine the path to Northwind.mdb: sDBPath = oAccess.SysCmd(Access.AcSysCmdAction.acSysCmdAccessDir, moMissing, moMissing).ToString(); sDBPath = sDBPath + @"Samples\Northwind.mdb"; // Open Northwind.mdb in shared mode: oAccess.OpenCurrentDatabase(sDBPath, false, ""); // If using Access 10.0 object library, use this instead: //oAccess.OpenCurrentDatabase(sDBPath, false, null); // Select the report name in the database window and give focus // to the database window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acReport, sReport, true); // Print the report: oAccess.DoCmd.OpenReport(sReport, Access.AcView.acViewNormal, moMissing, moMissing, Access.AcWindowMode.acWindowNormal, moMissing); // If using Access 10.0 object library, use this instead: //oAccess.DoCmd.OpenReport(sReport, // Access.AcView.acViewNormal, moMissing, moMissing, // Access.AcWindowMode.acWindowNormal, moMissing); } catch(Exception e) { MessageBox.Show(e.Message); } finally { // Release any Access objects and quit Access: try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; } } private void Preview_Report() { // Previews the "Summary of Sales by Year" report in Northwind.mdb. Access.Application oAccess = null; Access.Form oForm = null; string sDBPath = null; //path to Northwind.mdb string sReport = null; //name of report to preview // Enable exception handler: try { sReport = "Summary of Sales by Year"; // Start a new instance of Access for Automation: oAccess = new Access.ApplicationClass(); // Make sure Access is visible: if(!oAccess.Visible) oAccess.Visible = true; // Determine the path to Northwind.mdb: sDBPath = oAccess.SysCmd(Access.AcSysCmdAction.acSysCmdAccessDir, moMissing, moMissing).ToString(); sDBPath = sDBPath + @"Samples\Northwind.mdb"; // Open Northwind.mdb in shared mode: oAccess.OpenCurrentDatabase(sDBPath, false, ""); // If using Access 10.0 object library, use this instead: //oAccess.OpenCurrentDatabase(sDBPath, false, null); // Close any forms that Northwind may have opened: while(oAccess.Forms.Count > 0) { oForm = oAccess.Forms[0]; oAccess.DoCmd.Close(Access.AcObjectType.acForm, oForm.Name, Access.AcCloseSave.acSaveNo); NAR(oForm); oForm = null; } // Select the report name in the database window and give focus // to the database window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acReport, sReport, true); // Maximize the Access window: oAccess.RunCommand(Access.AcCommand.acCmdAppMaximize); // Preview the report: oAccess.DoCmd.OpenReport(sReport, Access.AcView.acViewPreview, moMissing, moMissing, Access.AcWindowMode.acWindowNormal, moMissing); // If using Access 10.0 object library, use this instead: //oAccess.DoCmd.OpenReport(sReport, // Access.AcView.acViewPreview, moMissing, moMissing, // Access.AcWindowMode.acWindowNormal, moMissing); // Maximize the report window: oAccess.DoCmd.Maximize(); // Hide Access menu bar: oAccess.CommandBars["Menu Bar"].Enabled = false; // Also hide NorthWindCustomMenuBar if it is available: try { oAccess.CommandBars["NorthwindCustomMenuBar"].Enabled = false; } catch{} // Hide Report's Print Preview menu bar: oAccess.CommandBars["Print Preview"].Enabled = false; // Hide Report's right-click popup menu: oAccess.CommandBars["Print Preview Popup"].Enabled = false; // Release Application object and allow Access to be closed by user: if(!oAccess.UserControl) oAccess.UserControl = true; NAR(oAccess); oAccess = null; } catch(Exception e) { MessageBox.Show(e.Message); // Release any Access objects and quit Access due to error: NAR(oForm); oForm = null; try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; } } private void Show_Form() { // Shows the "Customer Labels Dialog" form in Northwind.mdb // and manipulates controls on the form. Access.Application oAccess = null; Access.Form oForm = null; Access.Controls oCtls = null; Access.Control oCtl = null; string sDBPath = null; //path to Northwind.mdb string sForm = null; //name of form to show // Enable exception handler: try { sForm = "Customer Labels Dialog"; // Start a new instance of Access for Automation: oAccess = new Access.ApplicationClass(); // Make sure Access is visible: if(!oAccess.Visible) oAccess.Visible = true; // Determine the path to Northwind.mdb: sDBPath = oAccess.SysCmd(Access.AcSysCmdAction.acSysCmdAccessDir, moMissing, moMissing).ToString(); sDBPath = sDBPath + @"Samples\Northwind.mdb"; // Open Northwind.mdb in shared mode: oAccess.OpenCurrentDatabase(sDBPath, false, ""); // If using Access 10.0 object library, use this instead: //oAccess.OpenCurrentDatabase(sDBPath, false, null); // Close any forms that Northwind may have opened: while(oAccess.Forms.Count > 0) { oForm = oAccess.Forms[0]; oAccess.DoCmd.Close(Access.AcObjectType.acForm, oForm.Name, Access.AcCloseSave.acSaveNo); NAR(oForm); oForm = null; } // Select the form name in the database window and give focus // to the database window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acForm, sForm, true); // Show the form: oAccess.DoCmd.OpenForm(sForm, Access.AcFormView.acNormal, moMissing, moMissing, Access.AcFormOpenDataMode.acFormPropertySettings, Access.AcWindowMode.acWindowNormal, moMissing); // Use Controls collection to edit the form: oForm = oAccess.Forms[sForm]; oCtls = oForm.Controls; // Set PrintLabelsFor option group to Specific Country: oCtl = (Access.Control)oCtls["PrintLabelsFor"]; object[] Parameters = new Object[1]; Parameters[0] = 2; //second option in option group oCtl.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oCtl, Parameters); NAR(oCtl); oCtl = null; // Put USA in the SelectCountry combo box: oCtl = (Access.Control)oCtls["SelectCountry"]; Parameters[0] = true; oCtl.GetType().InvokeMember("Enabled", BindingFlags.SetProperty, null, oCtl, Parameters); oCtl.GetType().InvokeMember("SetFocus", BindingFlags.InvokeMethod, null, oCtl, null); Parameters[0] = "USA"; oCtl.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oCtl, Parameters); NAR(oCtl); oCtl = null; // Hide the Database Window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acForm, sForm, true); oAccess.RunCommand(Access.AcCommand.acCmdWindowHide); // Set focus back to the form: oForm.SetFocus(); // Release Controls and Form objects: NAR(oCtls); oCtls = null; NAR(oForm); oForm = null; // Release Application object and allow Access to be closed by user: if(!oAccess.UserControl) oAccess.UserControl = true; NAR(oAccess); oAccess = null; } catch(Exception e) { MessageBox.Show(e.Message); // Release any Access objects and quit Access due to error: NAR(oCtl); oCtl = null; NAR(oCtls); oCtls = null; NAR(oForm); oForm = null; try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; } } private void Print_Report_Security() { //Shows how to automate Access when user-level //security is enabled and you wish to avoid the logon //dialog asking for user name and password. In this //example we're assuming default security so we simply //pass the Admin user with a blank password to print the //"Summary of Sales by Year" report in Northwind.mdb. Access.Application oAccess = null; string sDBPath = null; //path to Northwind.mdb string sUser = null; //user name for Access security string sPwd = null; //user password for Access security string sReport = null; //name of report to print // Enable exception handler: try { sReport = "Summary of Sales by Year"; // Determine the path to Northwind.mdb: sDBPath = GetOfficeAppPath("Access.Application", "msaccess.exe"); if(sDBPath == null) { MessageBox.Show("Can't determine path to msaccess.exe"); return; } sDBPath = sDBPath.Substring(0, sDBPath.Length - "msaccess.exe".Length) + @"Samples\Northwind.mdb"; if(!System.IO.File.Exists(sDBPath)) { MessageBox.Show("Can't find the file '" + sDBPath + "'"); return; } // Specify the user name and password for the Access workgroup // information file, which is used to implement Access security. // Note: If you are not using the system.mdw in the default // location, you may include the /wrkgrp command-line switch to // point to a different workgroup information file. sUser = "Admin"; sPwd = ""; // Start a new instance of Access with user name and password: oAccess = ShellGetDB(sDBPath, "/user " + sUser + " /pwd " + sPwd, ProcessWindowStyle.Minimized, 1000); //or //oAccess = ShellGetApp(@"""" + sDBPath + @"""" + // " /user " + sUser + " /pwd " + sPwd, // ProcessWindowStyle.Minimized); // Select the report name in the database window and give focus // to the database window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acReport, sReport, true); // Print the report: oAccess.DoCmd.OpenReport(sReport, Access.AcView.acViewNormal, moMissing, moMissing, Access.AcWindowMode.acWindowNormal, moMissing ); // If using Access 10.0 object library, use this instead: //oAccess.DoCmd.OpenReport(sReport, // Access.AcView.acViewNormal, moMissing, moMissing, // Access.AcWindowMode.acWindowNormal, moMissing); } catch(Exception e) { MessageBox.Show(e.Message); } finally { // Release any Access objects and quit Access: try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; } } private void Preview_Report_Runtime() { //Shows how to automate the Access Runtime to preview //the "Summary of Sales by Year" report in Northwind.mdb. Access.Application oAccess = null; Access.Form oForm = null; string sDBPath = null; //path to Northwind.mdb string sReport = null; //name of report to preview // Enable exception handler: try { sReport = "Summary of Sales by Year"; // Determine the path to Northwind.mdb: sDBPath = GetOfficeAppPath("Access.Application", "msaccess.exe"); if(sDBPath == null) { MessageBox.Show("Can't determine path to msaccess.exe"); return; } sDBPath = sDBPath.Substring(0, sDBPath.Length - "msaccess.exe".Length) + @"Samples\Northwind.mdb"; if(!System.IO.File.Exists(sDBPath)) { MessageBox.Show("Can't find the file '" + sDBPath + "'"); return; } // Start a new instance of Access with a database. If the // retail version of Access is not installed, and only the // Access Runtime is installed, launches a new instance // of the Access Runtime (/runtime switch is optional): oAccess = ShellGetDB(sDBPath, "/runtime", ProcessWindowStyle.Minimized, 1000); //or //oAccess = ShellGetApp(@"""" + sDBPath + @"""" + " /runtime", // ProcessWindowStyle.Minimized); // Make sure Access is visible: if(!oAccess.Visible) oAccess.Visible = true; // Close any forms that Northwind may have opened: while(oAccess.Forms.Count > 0) { oForm = oAccess.Forms[0]; oAccess.DoCmd.Close(Access.AcObjectType.acForm, oForm.Name, Access.AcCloseSave.acSaveNo); NAR(oForm); oForm = null; } // Select the report name in the database window and give focus // to the database window: oAccess.DoCmd.SelectObject(Access.AcObjectType.acReport, sReport, true); // Maximize the Access window: oAccess.RunCommand(Access.AcCommand.acCmdAppMaximize); // Preview the report: oAccess.DoCmd.OpenReport(sReport, Access.AcView.acViewPreview, moMissing, moMissing, Access.AcWindowMode.acWindowNormal, moMissing ); // If using Access 10.0 object library, use this instead: //oAccess.DoCmd.OpenReport(sReport, // Access.AcView.acViewPreview, moMissing, moMissing, // Access.AcWindowMode.acWindowNormal, moMissing); // Maximize the report window: oAccess.DoCmd.Maximize(); // Hide Access menu bar: oAccess.CommandBars["Menu Bar"].Enabled = false; // Also hide NorthWindCustomMenuBar if it is available: try { oAccess.CommandBars["NorthwindCustomMenuBar"].Enabled = false; } catch{} // Release Application object and allow Access to be closed by user: if(!oAccess.UserControl) oAccess.UserControl = true; NAR(oAccess); oAccess = null; } catch(Exception e) { MessageBox.Show(e.Message); // Release any Access objects and quit Access due to error: NAR(oForm); oForm = null; try // use try..catch in case oAccess is not set { oAccess.Quit(Access.AcQuitOption.acQuitSaveNone); } catch{} NAR(oAccess); oAccess = null; } }
Dodaj następujący kod do dyrektyw Using w pliku Form1.cs:
using System.Runtime.InteropServices; using System.Diagnostics; using System.Reflection;
Naciśnij klawisz F5, aby skompilować i uruchomić program. Zostanie wyświetlony formularz Form1.
Kliknij pozycję Drukuj raport, a następnie kliknij pozycję Go!. Procedura Print_Report wyświetla raport z bazy danych Northwind.
Kliknij pozycję Podgląd raportu, a następnie kliknij pozycję Go!. Procedura Preview_Report wyświetla podgląd raportu z bazy danych Northwind. Zamknij wystąpienie programu Access, gdy wszystko będzie gotowe do kontynuowania.
Kliknij pozycję Pokaż formularz, a następnie kliknij pozycję Go!. Procedura Show_Form wyświetla formularz okna dialogowego Etykiety klienta z bazy danych Northwind. Ustawia również grupę opcji w formularzu na "Określony kraj" i wybiera pozycję "USA" z listy. Zamknij wystąpienie programu Access, gdy wszystko będzie gotowe do kontynuowania.
Kliknij pozycję Drukuj raport (Zabezpieczenia), a następnie kliknij pozycję Go!. Procedura Print_Report_Security pokazuje, jak zautomatyzować dostęp i jak uniknąć logowania w oknie dialogowym, jeśli włączono zabezpieczenia na poziomie użytkownika. W tym przykładzie przyjmij domyślne logowanie, przekazując użytkownikowi Administracja z pustym hasłem. Następnie kod drukuje raport w bazie danych Northwind.
Kliknij pozycję Podgląd raportu (środowisko uruchomieniowe), a następnie kliknij pozycję Go!. Procedura Preview_Report_Runtime pokazuje, jak zautomatyzować środowisko Access Runtime w celu wyświetlenia podglądu raportu w bazie danych Northwind. Jeśli zainstalowano wersję detaliczną programu Access, procedura nadal będzie działać poprawnie. Zamknij wystąpienie programu Access, gdy wszystko będzie gotowe do kontynuowania.
Informacje
Aby uzyskać więcej informacji, odwiedź następującą witrynę sieci Web MSDN: Microsoft Office Development with Visual Studio https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspxAby uzyskać więcej informacji, kliknij następujące numery artykułów, aby wyświetlić artykuły w bazie wiedzy Microsoft Knowledge Base:
317109 aplikacja pakietu Office nie jest zamykana po automatyzacji z poziomu klienta .NET programu Visual Studio
316126 Jak zautomatyzować uruchomione wystąpienie programu pakietu Office przy użyciu języka Visual C#