Posiadam baze danych w accessie i zrobiłam dla niej aplikacje okienkowa w visual C#. Teraz musze po stronie serwera czyli w accessie napisać funkcję dodającą dane do bazy (VB) i muszę te funkcję wywołać w visual w tej mojej aplikacji (np. po naciśnięciu jakiegos przycisku).
Przeszukałam internet wszerz i w wzdłuż i nic nie znalazłam na temat jak tego dokonać? Proszę o pomoc.
Nie wiem, czy do końca rozumiem co potrzebujesz. W każdy bądź razie tworzysz sobie kwerendę w Access, która będzie zawierała polecenie SQL wstawiające dane do tabeli, np.
INSERT INTO Tabel ( Col1, Col2 )
VALUES ([@Col1], [@Col2]);
(ja u siebie nazwałem tą kwerendę AddRowProc) Żeby utworzyć taką kwerendę musisz kliknąć prawym przyciskiem myszy na obszarze, na którym wyświetlane są tabele w widoku projektu kwerendy i wybrać opcję Widok SQL. Gdy już będziesz miała tą kwerendę to możesz ją wywołać przy użyciu np. takiej funkcji, której parametry to wartości, które mają zostać wstawione w tabeli.
Najpierw musisz dodać do projektu referencję do biblioteki (zakładka COM) Microsoft Access 12.0 Object Library (u Ciebie może to być 12.0, 11.0 lub coś innego w zależności od tego jaką wersję Access masz zainstalowaną na komputerze). Następnie tworzysz sobie taką funkcję
using Access = Microsoft.Office.Interop.Access;
.
.
.
public void RunAddRowMacro(string value1, string value2)
{
Access.Application adb = null;
try
{
adb = new Access.Application();
adb.OpenCurrentDatabase("pełna ścieżka do pliku Baza.mdb");
adb.Run("AddRowMacro", value1, value2);
adb.CloseCurrentDatabase();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (adb != null)
adb.Quit();
}
}
W Access stworzyłem sobie taką procedurę
Public Sub AddRowMacro(ByRef value1 As String, ByRef value2 As String)
DoCmd.RunSQL "INSERT INTO Tabel ( Col1, Col2 ) VALUES (" & value1 & ", " & value2 & ")", False
End Sub
Istotne jest to, żeby ten kod zadziałał to musisz zmienić ustawienia zabezpieczeń Access, tzn. ustawić, żeby się nie pytał, czy ma uruchomić makro. W Access 2007 robi się to następująco Opcje programu Access -> Centrum Zaufania -> Ustawienia centrum zaufania -> Ustawienia makr -> Włącz wszystkie marka.
Hm, no to się nie spodziewałem. Błąd jest dość jasny. Jaką masz wersję Access zainstalowaną? A raczej jaką bibliotekę dodałaś do referencji (podaj dokładną nazwę)?
Na Access 2007 powyższy kod działa bez zarzutu. No i jak wygląda definicja tego makro (procedury) z Access.
Public Sub dodaj(ByRef value1 As Integer, ByRef value2 As Integer)
DoCmd.RunSQL "INSERT INTO wklad_do_magazynu(id_nazwa, ilosc_wkladu ) VALUES (" & value1 & ", " & value2 & ")", False
End Sub
Niby wszystko wygląda ok. Ale tak jak mówiłem nie znam się na obiektach COM. Spróbuję odtworzyć ten błąd u siebie.
– Dodane 14.01.2011 (Pt) 15:52 –
No i lipa, u mnie ten kod działa. Jak dodawałaś referencję do biblioteki Microsoft Access 12.0 object library to automatycznie powinny się dodać następujące referencje: ADODB, DAO, Microsoft.Office.Core oraz VBIDE. Zobacz, czy też je masz.
Błąd jest gdzieś indziej. Ta metoda jest ok. A nie masz przypadkiem kilka procedur w Access, które mają nazwę dodaj? Może tu jest problem. I jak najedziesz myszką na metodę Run to powinnaś zobaczyć taką definicję.
A tych ref object Arg1 masz jeden, czy więcej? Chodzi mi o to ile parametrów ma ta metoda Run u Ciebie? Jak możesz to zrób screen shot, żebym mógł zerknąć.
oraz do każdego argument : że nie potrafi zamienić int na ref
po dodaniu "ref " przed każdym oMissing wyskakuje tylko jeden błąd ten co zawsze : No overload for method ‘Run’ takes ‘30’ arguments
A po za tym nie wiem dlaczego i nie wiem czy to ważne ale nie potrafie otwrzyć i zamknąć bazy tak jak Ty to robisz (wyskakuje mi ten sam błąd"no overload…"), czyli:
Ręce opadają Nie mam pojęcia z czego wynikają te różnice w definicjach metod skoro korzystamy z tych samych bibliotek.
U Ciebie te parametry metody Run i innych metod są wymagane, a u mnie opcjonalne. Dlatego mogę wywoływać te metody inaczej. Z czego to wynika? Pojęcia nie mam. Mogę tylko zgadywać. W jakiej wersji .NET robisz ten swój projekt? Zgaduję, że starszej niż 4.0? A jeśli w starszej to czy masz możliwość przejścia na wersję 4.0 i sprawdzenia początkowej wersji kodu? A co do reszty Twojej wypowiedzi. Spróbuj użyć taki kod metody:
A jaką masz wersję Visual Studio? Bo wcześniejsze niż 2010 nie obsługują chyba .Net Framework 4.
Co do kodu … mimo tego, że nie masz .Net 4 to już powinno to zadziałać -,-. Jaki komunikat błędu wywala (bo trochę się już pogubiłem)?
EDIT:
Nie zauważyłem, że edytowałaś post. Ok, to co jest teraz nie tak dokładnie? Jakiś komunikat błędu jest? Zobacz, czy nie jest aktywny jakiś proces zombie Accessa. W menadżerze zadań szukaj MSACCESS lub czegoś takiego. Jak będzie to go zakończ na chama i wtedy spróbuj ponownie uruchomić aplikację.
Tak, więc zainstalowałam VS 2010 i działa pierwsza wersja, którą podałeś. Jednak znowu mam problem Wyskakuje mi taki błąd “Program Microsoft Office Access nie może znaleźć procedury dodaj.” a ona jest w Bazie
Udało mi się wywołać ten błąd u siebie. Zobacz, czy zapisałaś tą procedurę w pliku z folderu Module. U mnie w przykładowej bazie danych wygląda to następująco.