Laden...

DataTable to Access Problem mit Primärschlüssel

Erstellt von steven vor 14 Jahren Letzter Beitrag vor 14 Jahren 704 Views
S
steven Themenstarter:in
79 Beiträge seit 2006
vor 14 Jahren
DataTable to Access Problem mit Primärschlüssel

verwendetes Datenbanksystem: <Access>

Hallo ihr Spezis,

Ich habe folgendes Problem:

Ich muss in einer Access DB einträge in einer Spalte ändern. In dieser Spalte sind Felder einer Matrix gespeicher. z.B. A1, A2, A3, A4, B1, B2 ,usw.

Beim eintragen dieser Werte ist ein fehler passiert. nun muss z.B. A1 mit A4 und A2 mit A3 getauscht werden.

Dazu gehe ich folgendermassen vor:
-Tabelle in DataTable - funzt
-Felder tauschen - funzt
-DataTable zurückschreiben - funzt nicht!

Die Spalte ist dummerweise die mit dem Primärschlüssel. Beim UPDATE bekomme ich ne Fehlermeldung wegen des Primärschlüssels.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BIA_Macro
{
    public partial class Form1 : Form
    {
        private string strDBName;
        private Class2 myAccessClass = new Class2();
        private DataSet myDS = new DataSet();
        private List<PairsToSwitch> liPairsToSwitch = new List<PairsToSwitch>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Paare für Spalte C
            liPairsToSwitch.Add(new PairsToSwitch("C1", "C5"));
            liPairsToSwitch.Add(new PairsToSwitch("C2", "C6"));
            liPairsToSwitch.Add(new PairsToSwitch("C3", "C7"));
            liPairsToSwitch.Add(new PairsToSwitch("C4", "C8"));

            //Paare für Spalte D
            liPairsToSwitch.Add(new PairsToSwitch("D1", "D5"));
            liPairsToSwitch.Add(new PairsToSwitch("D2", "D6"));
            liPairsToSwitch.Add(new PairsToSwitch("D3", "D7"));
            liPairsToSwitch.Add(new PairsToSwitch("D4", "D8"));
            
            //Paare für Spalte G
            liPairsToSwitch.Add(new PairsToSwitch("G1", "G5"));
            liPairsToSwitch.Add(new PairsToSwitch("G2", "G6"));
            liPairsToSwitch.Add(new PairsToSwitch("G3", "G7"));
            liPairsToSwitch.Add(new PairsToSwitch("G4", "G8"));
           
            //Paare für Spalte O
            liPairsToSwitch.Add(new PairsToSwitch("O1", "O5"));
            liPairsToSwitch.Add(new PairsToSwitch("O2", "O6"));
            liPairsToSwitch.Add(new PairsToSwitch("O3", "O7"));
            liPairsToSwitch.Add(new PairsToSwitch("O4", "O8"));
        }

        private void buttonOpenDB_Click(object sender, EventArgs e)
        {
            //Datei auswählen
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Title = "Access Datei";
            DialogResult result = fileDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                strDBName = fileDialog.FileName.ToString();
            }
            //Tabelle resulates importieren
            myDS = myAccessClass.FillDataset("SELECT * FROM resultats", strDBName);
        }
       
        private void buttonSwitchData_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < liPairsToSwitch.Count; i++)
            {
                SwitchData(liPairsToSwitch[i].OldData,liPairsToSwitch[i].NewData);
                
            }
            //exportiere geänderte Tabelle
            myAccessClass.UpdateDB(myDS.Tables[0], strDBName);[COLOR]<--UPDate an dieser stelle gibt ne Fehlermeldung
[/color]
            MessageBox.Show("Fertig");
        }
       

        private void SwitchData(string strOld, string strNew)
        {
            for (int i = 0; i < myDS.Tables[0].Rows.Count; i++)
            {
                if (myDS.Tables[0].Rows[i][1].ToString() == strOld)
                {
                    myDS.Tables[0].Rows[i][1] = "old";
                }
                if (myDS.Tables[0].Rows[i][1].ToString() == strNew)
                {
                    myDS.Tables[0].Rows[i][1] = "new";
                }
               // myAccessClass.UpdateDB(myDS.Tables[0], strDBName);[COLOR]<--UPdate hier und
[/color]
            }
            for (int i = 0; i < myDS.Tables[0].Rows.Count; i++)
            {
                if (myDS.Tables[0].Rows[i][1].ToString() == "old")
                {
                    myDS.Tables[0].Rows[i][1] = strNew;
                }
                if (myDS.Tables[0].Rows[i][1].ToString() == "new")
                {
                    myDS.Tables[0].Rows[i][1] = strOld;
                }
               // myAccessClass.UpdateDB(myDS.Tables[0], strDBName);[COLOR]<-hier geht ist aber langsam
[/color]
            }
        }
    }

    public class PairsToSwitch
    {
        public PairsToSwitch()
        {
        }

        public string OldData, NewData;
        public PairsToSwitch(string strOld, string strNew)
        {
            this.NewData = strNew;
            this.OldData = strOld;
        }

    }
}

Bitte rote Kommentare im Code beachten. Da es sich um sehr viele Datensätze handelt wird es mit den ständigen Updates sehr lange dauer alle daten zu ändern.

Da gibts doch bestimmt ne Methode die geänderte Tabelle zurückzuschreiben ohne des ich Probleme mit dem Primärschlüssel bekomme.

Danke schonmal im Vorraus
Gruß
Steven

J
3.331 Beiträge seit 2006
vor 14 Jahren

Hallo,

ich habe folgende Gedanken:

  1. Ist es möglich, den Primärschlüssel zu deaktivieren? Dann könntest du das machen, die Datensätze ändern und dann den Primärschlüssel wieder zu aktivieren.

  2. Nach dem Fill werden die Datensätze in der DB gelöscht; mit Update sollen sie wieder eingefügt werden. Dann musst du natürlich auf den **DataRowState **achten.

  3. Dass das Ganze sehr lange dauert, ist mit **Transaction **wesentlich zu verbessern. Ich habe nicht bedacht, dass es um Access geht.

wird es mit den ständigen Updates

Das ist doch wohl trotzdem eine einmalige Aktion, oder?

Gruß Jürgen

S
steven Themenstarter:in
79 Beiträge seit 2006
vor 14 Jahren

So erstmal Danke für die schnelle Antwort.

Naja einmahlig schon, aber es betrifft ca 60 Datenbänke...(Es hadelt sich hierbei um Messdaten und es wird pro Messung eine DB angelegt)

Deine beiden Vorschläge werde ich mal testen und sich das machen lässt.

Bye

1.274 Beiträge seit 2005
vor 14 Jahren

Dass das Ganze sehr lange dauert, ist mit Transaction wesentlich zu verbessern.

Warum streichst du das durch, du musst die Transaktion verwenden von OleDB. Dem Namespace von System.Transaction geht natürlich nicht.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

J
3.331 Beiträge seit 2006
vor 14 Jahren

Ich meinte gelesen zu haben, dass es Transactions in Access nicht gibt. Jürgen