Autor Beitrag
HannesA.
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 11.11.11 12:01 
Hallo liebe C# Gemeinde,

ich bin neu auf dem Gebiet C# und möchte ein Projekt für ein InfoPath Formular entwickeln. Im Moment probiere ich mich ein wenig an Datenverbindungen (für den Anfang mit Access) und hab bei einer Recherche folgenden Link gefunden:
Abrufen von Microsoft Access-AutoWert-Werten:
http://msdn.microsoft.com/de-de/library/ks9f57t0%28v=vs.80%29.aspx#Y1430

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
using Microsoft.Office.InfoPath;
using System;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;
using mshtml;
using System.Data;
using System.Data.OleDb;

namespace Bestellungen
{
    public partial class FormCode
    {
        // Membervariablen werden in browserfähigen Formularen nicht unterstützt.
        // Schreiben und lesen Sie diese Werte stattdessen aus dem FormState-
        // Wörterbuch, indem Sie Code wie folgt verwenden:
        //
        // private object _memberVariable
        // {
        //     get
        //     {
        //         return FormState["_memberVariable"];
        //     }
        //     set
        //     {
        //         FormState["_memberVariable"] = value;
        //     }
        // }

        // HINWEIS: Das folgende Verfahren ist für Microsoft InfoPath erforderlich.
        // Es kann mithilfe von Microsoft InfoPath geändert werden.
        public void InternalStartup()
        {
            ((ButtonEvent)EventManager.ControlEvents["CTRL31_5"]).Clicked += new ClickedEventHandler(CTRL31_5_Clicked);
        }

        public void CTRL31_5_Clicked(object sender, ClickedEventArgs e)
        {
            write_database();
        }

        public void write_database()
        {
            OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}\\Bestelldaten.accdb");
            
            // Assumes that connection is a valid OleDbConnection object.
            OleDbDataAdapter adapter = new OleDbDataAdapter(
                "SELECT CategoryID, CategoryName FROM Categories ORDER BY CategoryID"
            connection);

            adapter.InsertCommand = new OleDbCommand(
                "INSERT INTO Categories (CategoryName) Values(?)", connection);
            adapter.InsertCommand.CommandType = CommandType.Text;
    
            adapter.InsertCommand.Parameters.Add("@CategoryName", OleDbType.Char, 15"CategoryName");

            connection.Open();
 
            // Fill the DataSet.
            DataSet categories = new DataSet();
            adapter.Fill(categories, "Categories");

            // Add a new row.
            DataRow newRow = categories.Tables["Categories"].NewRow();
            newRow["CategoryName"] = "New Category";
            categories.Tables["Categories"].Rows.Add(newRow);

            // Include an event to fill in the Autonumber value.
            adapter.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);

            // Update the DataSet.
            adapter.Update(categories, "Categories");

            connection.Close();
        }
        
        // Event procedure for OnRowUpdated
        protected static void OnRowUpdated(
            object sender, OleDbRowUpdatedEventArgs args)
        {
            // Include a variable and a command to retrieve the identity value from the Access database.
            int newID = 0;
            OleDbCommand idCMD = new OleDbCommand(
                "SELECT @@IDENTITY", connection);

            if (args.StatementType == StatementType.Insert)
            {
                // Retrieve the identity value and store it in the CategoryID column.
                newID = (int)idCMD.ExecuteScalar();
                MessageBox.Show(newID.ToString());
                args.Row["CategoryID"] = newID;
            }

        }
    }
}


Leider bekomme ich es nicht hin, die "connection" Variable an die Funktion "OnRowUpdated" zu übergeben.
Bisher habe ich es wie folgt versucht:
Funktionsdeklaration:
ausblenden C#-Quelltext
1:
public static void OnRowUpdated(OleDbConnection connection, object sender, OleDbRowUpdatedEventArgs args)					

Funktionsaufruf:
ausblenden C#-Quelltext
1:
2:
// Include an event to fill in the Autonumber value.
adapter.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated(connection));


Dazu bekomme ich aber folgende Fehlermeldung:
ausblenden Quelltext
1:
Fehler  1  Keine Überladung für die OnRowUpdated-Methode nimmt 1 Argumente an.					


Wahrscheinlich ist es ganz einfach, aber so als Neuling kommt man auf die einfachsten Dinge manchmal nicht. :( Ich hoffe einer von Euch kann mir helfen.

Viele Grüße
Hannes
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 11.11.11 14:39 
Hallo Hannes und :welcome:

Deine Funktionsdeklaration weist drei Parameterwerte auf ...
ausblenden C#-Quelltext
1:
public static void OnRowUpdated(OleDbConnection connection, object sender, OleDbRowUpdatedEventArgs args)					

... und beim Funktionsaufruf gibst Du nur 1 Parameter mit?
ausblenden C#-Quelltext
1:
adapter.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated(connection, ???, ???));					

Das wird so also nicht funktionieren.
Da müsstest Du die fehlenden Parameter noch hinzufügen, damit die Überladung der Funktion gleichviele Argumente beinhaltet wie vorgegeben.

_________________
Gruss
mats74
HannesA. Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 12.11.11 12:03 
Hallo mats74,

vielen Dank für Deine Hilfe! Jetzt weiß ich, was diese Fehlermeldung zu bedeuten hat.
Leider wusste ich aber nicht, was ich für die anderen Parameter setzten sollte.
Außerdem erwartet die Methode nur "OleDbRowUpdatedEventHandler(void (object, OleDbRowUpdatedEventArgs) target).

Deshalb habe ich jetzt einfach die Variable "connection" für die gesamte Klasse deklariert.

Viele Grüße
Hannes
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Sa 12.11.11 15:11 
Hallo Hannes

Das finde ich eine gute Lösung.
Ich habe in meinen Projekten auch übergeordnete Variablen (für temporär änderbare Inhalte) in den Klassen definiert, auf die ich jederzeit aus den verschiedenen Methoden zugreifen kann.
Das gibt Dir dann eine einfache Möglichkeit, die übergeordneten Daten in den Methoden entsprechend zu verarbeiten.

_________________
Gruss
mats74