Ms Access + visual studiu C#

Witam wszystkich. Oto mój problem:

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.

public int ExecuteAddRowProc(string value1, string value2)

{

    OleDbConnection conn = null;

    OleDbCommand cmd = null;


    try

    {

        conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"

                + "Data Source=Baza.mdb");

        cmd = new OleDbCommand("AddRowProc", conn);

        cmd.CommandType = CommandType.StoredProcedure;


        cmd.Parameters.Add(new OleDbParameter("@Col1", value1));

        cmd.Parameters.Add(new OleDbParameter("@Col2", value2));


        conn.Open();

        return cmd.ExecuteNonQuery();

    }

    catch (Exception ex)

    {

        throw ex;

    }

    finally

    {

        if (conn != null && conn.State != ConnectionState.Closed)

            conn.Close();

    }

}

Plik baza.mdb w tym przykładzie umieszczony został w tym samym katalogu co plik *.exe aplikacji.

Dzięki wielkie.

Mniej więcej o to mi chodziło.

A czy jest możliwość stworzenia funkcji dodającej dane w Visual Basic w accessie i wywołanie go w VS C# ?

Jest, ale to już jest więcej roboty. Ja na obiektach COM się nie znam. Na podstawie tego linku

http://social.msdn.microsoft.com/Forums/eu/isvvba/thread/4e04f60f-319e-4e1b-8dae-d6cd49c57032 i tego

http://support.microsoft.com/kb/306683 zrobiłem to następująco.

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.

Niestety występuje u mnie problem i nie wiem jak sobie z nim poradzić.

Kompilator przyczepia mi się do linijki:

adb.Run("dodaj", value1, value2);

i wyskakuje błąd: No overload for method ‘Run’ takes ‘3’ arguments

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.

Microsoft Access 12.0 object library

mam accessa 2007

Definicja procedury (zapisałam to jako Module)

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.

Mam to wszystko :confused:

W sumie może prześle kod może to cos da:

public void RunAddRowMacro(int value1, int value2)

        {

            Access.Application adb = null;

            try

            {


                adb = new Access.Application();

                adb.OpenCurrentDatabase(@"D:\SEM_9\Bazy_danych\baza\WindowsFormsApplication1\bin\Debug\slodycze.mdb",true, "");

                adb.Run("dodaj",value1,value2);

                adb.CloseCurrentDatabase();

            }

            catch (Exception ex)

            {

                throw ex;

            }

            finally

            {

                if (adb != null)

                    adb.Quit(Access.AcQuitOption.acQuitSaveNone);

            }

        }

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ę.

na pewno mam tylko jedną proceture.

Definicja jednak trochę mi się różni:

zamiast dynamic _Application.Run mam object _Application.Run

oraz [ref object Arg1 = Type.Missing] mam samo ref object Arg1

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ąć.

do 30 tak jak u Ciebie

Rozumiem. Dobra spróbuj użyć takiej metody:

public void RunAddRowMacro(int value1, int value2)

{

    Access.Application adb = null;

    object oMissing = System.Reflection.Missing.Value;


    try

    {

        adb = new Access.Application();

        adb.OpenCurrentDatabase(Application.StartupPath + "\\slodycze.mdb");

        adb.Run("dodaj", value1, value2, oMissing, oMissing, oMissing,

            oMissing, oMissing, oMissing, oMissing, oMissing,

            oMissing, oMissing, oMissing, oMissing, oMissing,

            oMissing, oMissing, oMissing, oMissing, oMissing,

            oMissing, oMissing, oMissing, oMissing, oMissing,

            oMissing, oMissing, oMissing, oMissing, oMissing);

        adb.CloseCurrentDatabase();

    }

    catch (Exception ex)

    {

        throw ex;

    }

    finally

    {

        if (adb != null)

            adb.Quit();

    }

}

niestety też nie działa

Wyskakują takie błędy:

Error 1 The best overloaded method match for ‘Microsoft.Office.Interop.Access._Application.Run(string, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object, ref object)’ has some invalid arguments

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:

adb.OpenCurrentDatabase(Application.StartupPath + "\\slodycze.mdb");


adb.Quit();

Ręce opadają :smiley: 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:

public void RunAddRowMacro(int value1, int value2)

{

    Access.Application adb = null;

    object oMissing = System.Reflection.Missing.Value;


    object box1 = value1;

    object box2 = value2;


    try

    {

        adb = new Access.Application();

        adb.OpenCurrentDatabase(Application.StartupPath + "\\slodycze.mdb", true, "");

        adb.Run("dodaj", ref box1, ref box2, ref oMissing, ref oMissing, ref oMissing,

            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

        adb.CloseCurrentDatabase();

    }

    catch (Exception ex)

    {

        throw ex;

    }

    finally

    {

        if (adb != null)

            adb.Quit(Access.AcQuitOption.acQuitSaveNone);

    }

}

A tu jest definicja metody Run http://msdn.microsoft.com/en-us/library/bb214047%28v=office.12%29.aspx. Może się przyda.

działa! !!

ale ma teraz problem z otwarciem bazy :slight_smile:

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 :slight_smile: 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.

A jeśli chodzi o tą wersję metody z mojego poprzedniego posta to ona zadziałała ostatecznie na tej starszej wersji .NET, czy nie?