Laden...

Forenbeiträge von lebes Ingesamt 82 Beiträge

08.12.2006 - 15:53 Uhr

So ich geh jetzt erstmal ins Wochenende. Heute konnte ich mich leider garnicht mit dem Problem beschäftigen.

Die weiteren Vorschläge sind sicher gut und so wies ausschaut wird mir nichts weiter übrig bleiben, als die Daten zwischenzuspeichern. Was allerdings vermutlich schon zeitkritisch ist, da ich hinterher bei der Auswertung vielfach "sequentiell" die Array-Informationen brauche.

Ärgerlich ist natürlich, dass ich jetzt hier vier GB Speicher durchgeboxt habe und es nur "relativ" wenig Zusatznutzen bringt.

Da ich jetzt keine weiteren Ideen mehr erhalten habe, könnte es durchaus sein, dass es an einer prinzipiellen .net Beschränkung liegt.

Schönes Wochenende.

Gruß

07.12.2006 - 18:03 Uhr

Das klang zunächst sehr gut. Habe es eben ausgetestet und zunächst einfach zwei Arrays deklariert, was direkt zur gleichen Fehlermeldung führte.

Dauraufhin habe ich es noch mit fünf Arrays versucht. Leider ebenfalls erfolglos. Es bleibt bei der gleichen "maximalen" Gesamtgröße.

Es liegt also scheinbar nicht daran, dass alles innerhalb eines Arrays gespeichert wird.

Gruß

07.12.2006 - 14:03 Uhr

Das heißt soviel wie: Daran liegt es nicht, dass ich nur 1GB kriege???

07.12.2006 - 13:09 Uhr

Habe nun in einem Windows XP Forum die Frage platziert. Die zwei GB Grenze existiert so und vermutlich kriege ich nur knapp über einen GB, weil es ja noch diesen Puffer gibt.

Prinzipiell sollte es auch ausreichen die Veränderungen der Boot.Ini durchzuführen um die 3GB Option zu aktivieren. Nur leider hat das hier bisher nicht zum Erfolg geführt.

Ein weiterer Hinweis dort war, dass man was an den Compileroptionen ändern müsste:
"Eine 32-bittige App kann

  • unter 32bittigem Win mit /3GB Switch bis zu 3GB allozieren
  • unter 64bittigem Win bis zu 4GB allozieren
    wenn gleichzeitig das LARGEADDRESSAWARE Flag bei dieser App
    (Linker-Switch) gesetzt ist. "

Dann war da noch die Rede, dass es auch ein wenig davon abhängt wie groß die Happen sind, die man jeweil alloziiert.

Meine Frage ist nun wie ich in Visual Studio Linker bzw. Compiler Optionen setzten kann. Vielleicht ist das ja tatsächlich momentan noch mein Problem.

Über die Variante mit der manuellen Zwischenspeicherung denke ich momentan auch ernsthaft nach (auch wenn ichs lieber vermeiden möchte). Allerdings möchte ich jetzt (wo ich schon einiges an Zeit reingesteckt habe) auch das Problem mit der 3GB Grenze gelöst kriegen.

Gruß

07.12.2006 - 10:16 Uhr

Habe jetzt schon einige Male von dieser "magischen" 2 GB Grenze gelesen. Bei mir steigt das Programm (laut Task Manager) allerdings schon bei knapp über einen GB aus. 2GB würde mir auch schon sehr helfen.
Wie könnte man vorgehen um rauszufinden, warum er bei mir schon bei 1GB aussteigt? Ideen?

Werde auf jeden Fall den SysAd jetzt erstmal schreiben, dass es noch nicht funktioniert und mal sehen, ob er noch Ideen hat.

Gruß

06.12.2006 - 16:17 Uhr

OK, einer der SysAds hier hat mir eben mitgeteilt, dass er die (auf den entsprechenden Links beschriebenen) Änderungen in der Boot.Ini Datei durchgeführt hat.

Habe also meinen Rechner runtergefahren, neugestartet und es nochmal ausprobiert. Leider hat sich an der Situation nichts geändert. Kriege immer noch diese OutofMemoryException.

Vermute daher, dass man zusätzlich in Visual Studio bestimmte Veränderungen durchführen muss. Irgendjemand eine Idee was ich an den SysAd weiterleiten könnte?

Gruß

05.12.2006 - 18:13 Uhr

Vielen Dank für die Infos!-)

@herbivore: Bei mir bietet mir Google ein Samsung Notebook mit 3 GB Festplatte an erster Stelle an😉 Kannst du mir evt. den genauen Link schicken?

Habe jedenfalls jetzt so ein paar Infos gefunden. Wenn ich das richtig verstehe, muss ich kleine Änderungen in der Boot.Ini Datei durchführen (wofür ich sicherlich Adminrechte brauche, oder? ). Ist es damit dann getan oder muss ich speziell in der Visual Studio Umgebung noch Einstellungen ändern?

Gruß

05.12.2006 - 11:55 Uhr

Weiß hier jemand wie ich die Speicherbegrenzung auf 3GB hochsetzen kann?

Was sind Memory mapped Files? Das "Monsterarray" wird im Verlauf einer Simulation gefüllt. Daher ist die Sache auch "zeitkritisch". Wenn Memory mapped Files die Daten immer wieder von der Festplatte lesen müssen, wird mir wahrscheinlich nicht geholfen sein,-)

Gruß

05.12.2006 - 11:41 Uhr

Habe eben die Programmausführung im Task Manager beobachtet. Beim Start des Programmes liegt die Speicherbelastung bei ca. 150MByte. Dann wird sukzessive das Array gefüllt und der Speicherbedarf steigt stetig auf ziemlich genau ein Gigabyte. Scheinbar reserviert das Programm nur genau diesen einen Gigabyte.

Wenn ich nun in der Systemleistung nachschaue, wird mir ein noch verfügbarer Speicher von fast zwei Gigabyte angezeigt.

Ist das hier eine generelle C# Beschränkung (zB wegen Garbage Collector oder ähnlichem) oder kann man die Speicherreservierung manuell erhöhen?

05.12.2006 - 11:12 Uhr

Danke für die Infos.

Wie kann man denn die Reservierung für Anwendungprogramme auf drei Gigabyte steigern?

Gibt es eine Möglichkeit sich die aktuelle Speicherbelegung eines C# Programmes anzeigen zu lassen?

Gruß

04.12.2006 - 17:48 Uhr

Hallo,

ich habe ein dreidimensinales long Array mit folgender Dimensionierung addressiert:
x = variabel
y = 47
z = 10

Hatte bis gestern 1024 MByte Arbeitsspeicher und habe damit x auf ca. 150000 setzten können. Danach kam eine Out of Memory Meldung.

Soweit so gut. Seit heute habe ich vier Gigabyte Arbeitsspeicher. Die Fehlermeldung kommt nun bei knapp über x = 200000. Das enttäuscht und verwirrt mich irgendwie. Wenn ich mit 4 Byte pro long Eintrag rechne, komme ich bei x=250000 zu einem Speicherbedarf von ca. 450 MByte. Da sollte doch bei vier Gig Arbeitsspeicher deutlich mehr drin sein. Oder hat C# interne Beschränkungen?

Gruß

29.11.2006 - 18:13 Uhr

Gibt es in C# eine elegante Möglichkeit ein Array zu Redimensionieren unter Beibehaltung der bisherigen Inhalte? Quasi das, was man in VB durch:
Redim Preserve Array

erreicht.

Gruß

29.11.2006 - 14:14 Uhr

Hallo,

wie kann ich in einem ZedGraph die Achsenintervalle selbst definieren? Die Methode AxisChange funktioniert prinzipiell gut nur ist si völlig "nutzlos", wenn der Graph einige Ausreißer enthält. Man sieht dann das wesentliche leider nicht mehr.

Habe mir bisher damit geholfen, dass ich die Ausreißer gestutzt habe. Auf Dauer ist das aber eine eher unpraktische Methode.

Gruß

21.11.2006 - 14:18 Uhr

Hab jetzt nochmal genauer gekuckt.
Du hast recht! Ich hab da einen Fehler gemacht und immer aus dem Verzeichnis obj gestartet. Dort war sie nicht drinn.

Was ist denn der Unterschied zwischen Obj und Bin?

Gruß

21.11.2006 - 13:36 Uhr

Hallo,

gibt es in VS die Möglichkeit zur Versionierung? Oder wie kann ich ein Projekt "sicherheitkopieren", um den Status Quo zu sichern und dann unbeschwert am Code herumzubasteln?

Bisher hab ich mir damit beholfen, dass ich das komplette Verzeichnis kopiert habe. Das ist natürlich eher weniger schön. Unter Datei kann ich ja immer nur einzelne Programmteile speichern und nicht das komplette Projekt.

Dank für Hinweise.

Gruß

21.11.2006 - 13:33 Uhr

Klingt alles sehr gut. Nur steht die lokale Kopie schon auf True. Hab sie jetzt mal auf false und wieder zurück auf true gesetzt ohne Veränderung. Keine Ahnung warum das nicht geht.

Hab im Anschluss die DLL einfach ins Startverzeichnis kopiert und jetzt funkzt!-)

Vielen Dank!

21.11.2006 - 13:22 Uhr

Ja du hast recht. Wenn ich mir die Sache anschaue bevor ich die erste Message Box anklicke gibt es tatsächlich noch einen weiteren Prozess. Dieser verschwindet aber sobald ich die Box wegklicke.

Habe nun an der Stelle, wo die Box angezeigt wird den Debugger gestartet und tatsächlich tritt in der Zeile:


public Form1()
        {
            InitializeComponent(); <--- Fehlermeldung
        }

ein Fehler auf. Dieser wird mir allerdings außerhalb des Debug Modus nicht angezeigt. Die Fehlermeldung läßt stark vermuten, dass es was mit der ZedGraph dll zu tun hat:
System.IO.FileNotFoundException wurde nicht behandelt.
Message="Die Datei oder Assembly ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60 oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden."
Source="CrisCon_Light"
FileName="ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60"
FusionLog="=== Zustandsinformationen vor Bindung =\r\nLOG: Benutzer = IKB\s210991\r\nLOG: DisplayName = ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60\n (Fully-specified)\r\nLOG: Appbase = file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/\r\nLOG: Ursprünglicher PrivatePath = NULL\r\nAufruf von Assembly : CrisCon_Light, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.\r\n=\r\nLOG: Diese Bindung startet im default-Load-Kontext.\r\nLOG: Es wurde keine Anwendungskonfigurationsdatei gefunden.\r\nLOG: Die Computerkonfigurationsdatei von C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config wird verwendet.\r\nLOG: Verweis nach der Richtlinie: ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph.DLL.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph/ZedGraph.DLL.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph.EXE.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph/ZedGraph.EXE.\r\n"
StackTrace:
bei CrisCon_Light.Form1.InitializeComponent()
bei CrisCon_Light.Form1..ctor() in X:\Visual C#\Projects\CrisCon_Light\CrisCon_Light\Form1.cs:Zeile 17.
bei CrisCon_Light.Program.Main() in X:\Visual C#\Projects\CrisCon_Light\CrisCon_Light\Program.cs:Zeile 34.

Anfangen kann ich damit nicht viel. Aber ich vermute, dass die Problemlösung nun nicht mehr weit ist.
Wie gesagt aus VS heraus funkzt problemlos.

Gruß

21.11.2006 - 13:07 Uhr

Hört sich nach einer guten Idee an, aber es funktioniert nicht. Der Prozess hat den Namen: Programmname.vshost.exe und wenn ich den befehl "an Prozess anhängen" auswähle, dann kann ich diesen nicht "auswählen". Er steht zwar in der Liste, allerdings in grauer Schrift und der Typ ist "verwaltet". Alle anderen Prozesse haben hingegen den Typ x86.

Vermute mal stark, dass das was mit meinem Problem zu tun hat... nur was?

Gruß

21.11.2006 - 12:00 Uhr

Ok hab jetzt eine zweite Message Box in die Prozedur FormLoad eingebaut. Starte ich von VS bekomme ich beide Message Boxen und danach geht dir Form auf.

Starte ich aus dem Explorer kommt nur eine Message Box. Die zweite erscheint nicht mehr und die Form geht auch net auf. Ein Prozess mit dem namen ist aber im Task Manager zu sehen.

Was kann ich jetzt noch machen, um den Fehler zu beheben?

Gruß

20.11.2006 - 16:53 Uhr

Also der Prozess läuft im Task Manager. Hab das mit der Messagebox ausprobiert. Diese wird angezeigt. Mein Hauptprogramm sieht wie folgt aus:



static void Main()
        {
            Init();
            
            MessageBox.Show(" Dies ist ein test");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

             
            
        }

Die Messagebox kommt noch. Die Form wird dann aber nicht mehr angezeigt. Starte ich aus VS wird die Form anstandslos angezeigt.

Kann das was mit dem ZedGraph zu tun haben? Wär jetzt schon ein bisl aufwendig, den zum Testen wieder rauszunehmen. Außerdem will ich den natürlich auch behalten.

Gruß

20.11.2006 - 16:24 Uhr

Hallo,

mein Programm startet nicht, wenn ich es aus dem Explorer heraus aufrufe. Man sieht nur kurz eine Sanduhr und dann passiert nichts mehr (sowohl im Debug als auch im Release Ordner).
Heute vormittag ging es noch problemlos. Momentan kann ich es nur noch über die Visual Studio Opberfläche aufrufen. Dann geht die Form problemlos auf und das Programm funktioniert tadellos.

Seid heute morgen habe ich ein ZedGraph Control hinzugefügt und die ContextSwitchDeadlock Ausnahme ausgeschaltet.

Ideen oder Vorschläge?

Gruß

20.11.2006 - 14:32 Uhr

Vielen Dank.

Versteh das Problem zwar überhaupt nicht, aber nach durchführen der Anweisung funktionierts.

20.11.2006 - 13:59 Uhr

Hallo,

ich kriege hier folgende seltsame Fehlermeldung:
ContextSwitchDeadlock wurde erkannt.
Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x1b0578 zum COM-Kontext 0x1b06e8 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

Meine Programmstruktur:
Zunächst öffne ich eine Form. In dieser kann man verschiedene Parameter eingeben. Durch drücken des Button Starts beginnt eine Simulation. Nach ca. 60 Sekunden bricht das Programm ab und liefert obigen Fehler. Als (Ex-)VBAer kann ich damit leider absolut garnix anfangen.

Wie kann ich diesen Fehler vermeiden? Vielen Dank für Infos.

Gruß

20.11.2006 - 11:44 Uhr

Hallo,

wie kann man in C# Diagramme bzw. Graphen zeichnen. Perfekt wäre eine Funktion der ein Array aus x,y-Werten übergeben wird und die dann den passenden Graphen in eine Form zeichnet.

Gibt es sowas evt. sogar als Steuerelement?

Gruß

17.11.2006 - 17:46 Uhr

Verstehe leider adhoc nicht recht was da steht. Ich will ja garnicht, dass zwei Forms miteinander kommunizieren, sondern nur auf das eine Haupform zugreifen können. Als Hauptform deklariere ich ja Oberfläche und es scheint mir ganz natürlich, dass ich über Oberfläche.xxx auf die Controls zugreifen könnte. Aber das funktioniert leider nicht. Was genau mach ich den da falsch?

Sry für meine sicher wenig qualifizierten Fragen, aber ein kurzes Codebeispiel würde mir sehr helfen.

Gruß

17.11.2006 - 17:39 Uhr

Hier nochmal vollständig mein Code:


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void B_DatenEinlesen_Click(object sender, EventArgs e)
        {
            int cIndex;
            for (cIndex=1; cIndex<=100;cIndex++)
            PB_Fortschrittsbalken. = cIndex;  <---- hier kann ich problemlos auf das Obekt zugreifen

            

            Program.DatenLeseObject.KundenTabelleVerbinden();
            Program.Cholesky_Init();
            
        }



und hier das Programm:


static class Program
    {
        

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Init();
            Form1 Oberfläche = new Form1();
            
            Oberfläche.  <---- hier kennt er den PB_Fortschrittsbalken leider nicht
            Form1.   <------ so kennt er in leider auch nicht
            

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(Oberfläche);

             
            
        }


Es muss doch möglich sein aus dem Hauptprogramm aus auf die Controls zuzugreifen ohne alle Controls einzeln zu übergeben.

Gruß

17.11.2006 - 17:28 Uhr

@Borg: Also ehrlich gesagt kommt in meiner Form Klasse das Objekt PB_Fortschrittsbalken garnicht vor. Ich habe es nur im Entwickler in die Form eingebaut und kann in der Form Klasse auch darauf zugreifen. Außerhalb der Form Klasse kann ich leider nicht darauf zugreifen.

@thejudge: Daran hatte ich auch schon gedacht das Controll zu übergeben, aber da ich im hauptprogramm auf eine Vielzahl von Controls zugreifen muss, müsste ich ja jedes einzeln übergeben. Das kann doch sicher nicht der einzige Weg sein.
In VB zB konnte ich eig. immer ganz problemlos von überall auf meine Controlls zugreifen.

Gruß

17.11.2006 - 17:11 Uhr

Hallo,

bin neu im Umgang mit Visual C# Forms. Habe nun eine Form entwickelt mit einem Button und einem Prograss Bar.

Will ich auf diese Objekte zugreifen, so ist das innerhalbt der Form Klasse kein Problem. Wie kann ich aber von "außen" darauf zugreifen?

Mein naiver Angang sieht so aus:



static void Main()
        {
            
            Form1 Oberfläche = new Form1();
            Oberfläche.PB_Fortschrittsbalken.Value = 5;
         }

Nur leider kennt er das Objekt PB_Fortschrittsbalken hinter Oberfläche überhaupt nicht.

Kann mir jemand schnell mal auf die Füße helfen. Danke.

Gruß

17.11.2006 - 16:51 Uhr

Hallo,

kann mir jemand von euch ein gutes C# Buch empfehlen. Habe hier den dicken Schincken von Andreas Kühnel liegen und merke leider immer mehr, dass ich mit seinem Schreibstil nicht immer gut klarkomme.

Das Visual Basic Buch von Koffler hat mir sehr gut gefallen. Es gibt wohl auch ein C# Buch andem Koffler Teile mitgeschrieben hat. Ist das zu empfehlen?

Vielen Dank schon mal für eure Tipps.

Gruß

Sebastian

15.11.2006 - 18:33 Uhr

Hallo,

wie kann man aus einer begonnen Consolen Anwendung nachträglich eine Windows Anwendung machen?

Das geht doch sicher eleganter, als über den Umweg alle Klassen in eine neue Windows Anwendung zu kopieren, oder?

Vielen Dank.

Gruß

15.11.2006 - 12:07 Uhr

Was ist das Problem mit "trig gerissen"???
An dem leerzeichen kann es doch wohl nicht liegen?

Gruß

15.11.2006 - 12:05 Uhr

Hallo,

ich möchte von Access aus ein C# Programm starten. Dazu möchte ich in Access eine Form mit einem Startbutton erstellen. Bei Druck des Buttons soll das Programm dann starten.

Kann mir jemand erklären wie das geht bzw. wo man es nachlesen kann.

Vielen Dank.

Gruß

14.11.2006 - 16:29 Uhr

Hab die Sache jetzt über ein Excecutenonquery abgearbeitet. Bisl "nerviger", aber es funktiert wenigstens.

Es waren drei Spalten: ID, Jahr, Trig gerissen

Jahr habe ich auch noch in einer anderen Tabelle, aber das sollte kein Problem sein, oder?

Gruß

14.11.2006 - 14:25 Uhr

Hab jetzt den Spaltennamen in was "abenteuerliches" geändert. Leider kommt weiterhin der gleiche Syntaxfehler:-(

Gruß

14.11.2006 - 13:39 Uhr

Gut zu wissen. Aber in dem Fall hatte ich noch keine 50 Spalten.

Mir scheint es irgendwie, dass der Treiber "unstabil" ist. Habe mal wieder Schwierigkeiten mit einer neu erstellen Tabelle. Folgender Code liedert einen Fehler:


cmb = null;
            DA = null;
            DA = new OleDbDataAdapter();
            cmb = new OleDbCommandBuilder(DA);
            sSQL = "Select * From Ergebnisse_Trigger";
            cmdCommmand.CommandText = sSQL;
            DA.SelectCommand = cmdCommmand;
            DT = null; ;
            DT = new DataTable();
            DA.Fill(DT);

           
            DT.Rows[1]["Trigger"] = 23;

            cmb.GetUpdateCommand();
            DA.Update(DT);




Das müsste doch eigentlich gehen??? Die Tabelle enthält gerade mal 6 Spalten. Als Fehlermeldung kommt:

System.Data.OleDb.OleDbException wurde nicht behandelt.
Message="Syntaxfehler in UPDATE-Anweisung."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217900
StackTrace:
bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
bei ConsoleApplication6.Program.Main(String[] args) in X:\Visual C#\Projects\ConsoleApplication6\ConsoleApplication6\Program.cs:Zeile 886.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Kapiers einfach net,-( Besonders da der gleiche Code bei einer anderen Tabelle problemlos funktz.

Gruß

13.11.2006 - 11:31 Uhr

Habe eben die angehängten Spalten wieder gelöscht und das Updaten funktioniert wieder. Das ist schon ne Sisiphusarbeit mit diesen Datenbanken😉

Worauf muss ich denn beim Spaltenhinzufügen achten? Was könnte das Problem sein?

Gruß

13.11.2006 - 10:58 Uhr

Hallo,

habe mal wieder ein Problem mit dem Updaten. Vergangenen Freitag ging es noch problemlos. Nun habe ich die Access Tabelle um einige Spalten erweitert und kriege plötzlich folgende Fehlermeldung:

System.Data.OleDb.OleDbException wurde nicht behandelt.
Message="Syntaxfehler (fehlender Operator) in Abfrageausdruck '((ID = ?) AND ((? = 1 AND Ertrag IS NULL) OR (Ertrag = ?)) AND ((? = 1 AND Anzahl_Ertrag IS NULL) OR (Anzahl_Ertrag = ?)) AND ((? = 1 AND Verlust IS NULL) OR (Verlust = ?)) AND ((? = 1 AND Anzahl_Verlust IS NULL) OR (Anzahl_Verlust = ?)) AND ((? = 1 AND E'."
Source="Microsoft JET Database Engine"
ErrorCode=-2147217900
StackTrace:
bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
bei ConsoleApplication6.Program.Main(String[] args) in X:\Visual C#\Projects\ConsoleApplication6\ConsoleApplication6\Program.cs:Zeile 696.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Kann damit erst mal gearnichts anfangen.

sSQL = "Select * From Ergebnisse";
                cmdCommmand.CommandText = sSQL;
                DA.SelectCommand = cmdCommmand;
                DT = null; ;
                DT = new DataTable();
                DA.Fill(DT);

                //long Anzahl_Zeilen = DT.;


                for (cIndex = 0; cIndex <= Ergebnisse.Anzahl_Stützstellen + 4; cIndex++)
                {
                    DT.Rows[cIndex]["Ertrag"] = (Ertragsintervall * cIndex + result.Ertrag_Min);
                    DT.Rows[cIndex]["Anzahl_Ertrag"] = result.Verteilung_Ertrag_ohne[cIndex];

                    DT.Rows[cIndex]["Verlust"] = (Verlustintervall * cIndex + result.Verlust_Min);
                    DT.Rows[cIndex]["Anzahl_Verlust"] = result.Verteilung_Verlust_ohne[cIndex];

                    DT.Rows[cIndex]["Ertrag_mit"] = (Ertragsintervall_mit * cIndex + result.Ertrag_Min_mit);
                    DT.Rows[cIndex]["Anzahl_Ertrag_mit"] = result.Verteilung_Ertrag_mit[cIndex];
                }
                
            
                cmb.GetUpdateCommand();
                DA.Update(DT);

Hat ja vermutlich was damit zu tun, dass ich Spalten in die Tabelle ergänzt habe. Hat jemand Ideen?

Gruß

10.11.2006 - 12:26 Uhr

Hi Rainbird,

hab mich mittlerweile doch entschieden die Sache auf Access aufzusetzten. Diese ständige Spaltenverschieberei hat mir den letzten Nerv geraubt😉 Außerdem ist der Zugriff damit tatsächlich deutlich einfacher.

Über das Importrieren der Daten mach ich mir dann bei Gelegenheit Gedanken. Vielen Dank für die Hilfe.

Gruß

07.11.2006 - 11:40 Uhr

Hallo,

habe es leider immer noch nicht geschafft meine Excel Datentabellen vernünftig upzudaten. Was mittlerweile klappt, ist folgende Variante:


for (cIndex = 0; cIndex <= Anzahl_Stützstellen+4; cIndex++)
            {
                                
                cmd2.CommandText = "UPDATE [Ergebnisse$] SET Verlust ="+ Convert.ToInt64(Verlustintervall * cIndex+Verlust_Min)+", Anzahl_V ="+ Verteilung_Verlust_ohne[cIndex] + ",Ertrag =" +Convert.ToInt64(Ertragsintervall * cIndex+Ertrag_Min) + ",Anzahl_E ="+ Verteilung_Ertrag_ohne[cIndex]+" WHERE ID ="+ (int)(cIndex+1);
                Console.WriteLine("{0}", cIndex);
                //Console.ReadLine();
                cmd2.ExecuteNonQuery();
            }


Das Problem an dieser Variante ist, dass sie "unerträglich" langsam ist.

Daher versuche ich das updaten mittes DataAdapter.Update. Leider komme ich da nicht zu Potte. Folgender Code:


DataTable DB_Ergebnisse = new DataTable("ExcelData");

            cmd.CommandText = "SELECT ID,Verlust,Anzahl_V,Ertrag,Anzahl_E FROM [Ergebnisse$]";
            da.SelectCommand = cmd;
            da.Fill(DB_Ergebnisse);

            DB_Ergebnisse.Rows[4]["ID"] = 66;

            OleDbCommandBuilder cmb = new OleDbCommandBuilder(da);
            
            
            da.Update(DB_Ergebnisse);


Die letzte Zeile liefer leider folgenden Fehler:
Dynamische SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand unterstützt, der keine Schlüsselspalteninformationen zurückgibt.

Diese C# Excel Schnittstelle schafft mich langsam😉

Gruß

07.11.2006 - 10:39 Uhr

Hi Rainbird,

kannst du mir vielleicht ein kurzes Programmbeispiel schicken, wie ich folgenden Code abschließen muss, damit er alle Änderungen im Excel Sheet übernimmt? Das wäre echt klasse.


            DataTable DB_Ergebnisse = new DataTable("ExcelData");

            cmd.CommandText = "SELECT * FROM [Ergebnisse$]";
            da.SelectCommand = cmd;
            da.Fill(DB_Ergebnisse);


            for (cIndex = 1; cIndex <= Anzahl_Stützstellen; cIndex++)
            {
                DB_Ergebnisse.NewRow();
                DB_Ergebnisse.Rows[cIndex + 1][1] = Verlustintervall * cIndex;
                DB_Ergebnisse.Rows[cIndex + 1][2] = Verteilung_Verlust_ohne[cIndex];

                DB_Ergebnisse.Rows[cIndex + 1][4] = Ertragsintervall * cIndex;
                DB_Ergebnisse.Rows[cIndex + 1][5] = Verteilung_Ertrag_ohne[cIndex];
            }



Wie sehen nun die zwei-drei Zeilen aus um die Inhalte des DataAdapters auf das Sheet zurückzuschreiben?

Gruß

07.11.2006 - 10:34 Uhr

Naja, die meisten hier arbeiten mit Excel und ich würde die Daten auch immer in Excel Sheets geliefert bekommen. Dann müsste ich händisch die Sachen nach Acces kopieren.

Das muss doch irgendwie funktionieren, dass die C# Schnittstelle deterministisch auf die Daten zugreift und nicht das eine Mal eine Leerspalte einliest, das andere mal nicht???

06.11.2006 - 18:50 Uhr

Habe zwar immer noch keine Ahnung woran es liegt, dass er zB mal die erste (leere) Spalte einliest und mal nicht. Was ich aber mittlerweile festgestellt habe, ist dass dieser "Sinneswandel" im Einlesen nur stattfindet, wenn ich vorher das Excelworkbook abgespeichert habe. Dabei habe ich allerdings nichts wesentliches geändert.

Eben zB einfach nur aus 4% 8% gemacht gespeichert, rums läd er die erste Spalte wieder ein. Und ich muss mal wieder alle Indizes verschieben. Das ist wirklich selten dämlich😉

Das Workbook ist während des Zugriffes verschlossen und es stehen halt ein paar Zahlen drin. Die erste Spalte ist wie gesagt leer.

Gruß

06.11.2006 - 16:51 Uhr

Hallo,

sry, dass ich heute einen Fragenflash habe. Nur leider komme ich ohne eure Hilfe keinen Deut weiter. Will einzelne Zellen in einem Excel Datenblatt aktualisieren.
Benutze dazu (zB) folgenden Code:


cmd2.CommandText = "UPDATE [Ergebnisse$A1:A1] SET F1 = 11"

Der wird ohne zu meckern geschluckt. Nur leider ändert sich an der Tabelle überhaupt garnix;-(

Was mach ich falsch?

Gruß

06.11.2006 - 15:53 Uhr

Hallo,

habe ein nerviges Problem beim Einlesen von Excel Tabellen. Folgender Code:


OleDbConnection con = new OleDbConnection();

            con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=X:\Office\Excel\Kalki.xls; Extended Properties=""Excel 8.0;HDR=Yes""";             

            OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Pool$]", con);
            

                        DataTable DB_Pool = new DataTable("ExcelData");


liefert keine determistischen Ergebnisse. In meiner Tabelle ist zB die erste Spalte leer. Von Zeit zu Zeit ignoriert er diese dann völlig (wenn ich mir die Tabelle auf der Visual Studio Oberfläche anschaue). Dann aber hin-und wieder liest er die Spalte doch ein. Ähnliches passiert mit der obersten Zeile. Das macht mich mittlerweile leicht wahnsinnig.

Wie kann ich mir da helfen? Vielen Dank für Tipps.

Gruß

06.11.2006 - 15:15 Uhr

Hallo,

habe folgendes Problem:
Wenn ich mittels:


cmd2.CommandText = "INSERT INTO [Ergebnisse$](Verlust,Anzahl_V,Ertrag,Anzahl_E) VALUES(" + Convert.ToInt64(Verlustintervall * cIndex) +","+ Convert.ToInt64(Verteilung_Verlust_ohne[cIndex])+"," +Convert.ToInt64(Ertragsintervall * cIndex)+","+Convert.ToInt64(Verteilung_Ertrag_ohne[cIndex])+")";


einfüge geht das völligst problemlos. Wenn ich nun aber die Konvertierung weglasse und mir double Zahlen ausgeben lasse, bekommt der String neue Kommas (zB. 23,4563 ) und das liefert dann die Fehlermeldung: Zuviele Parameter.

Wie kann ich das Problem lösen ohne gleich die kompletten Nachkommastellen abzuschneiden?

Gruß

06.11.2006 - 15:12 Uhr

Hi Talla,

danke für die Antwort. Genau das war das Problem. Habs jetzt auf Debug Mode umgestellt und alles geht prima.

Aber was ist eigentlich der Unterschied zwischen Release und Debug Mode?

Gruß

06.11.2006 - 14:33 Uhr

Hallo,

habe ein seltsames Problem. Normalerweise kann man sich in Visual Studio beim Schritt für Schritt Debuggen die Variablenwerte anzeigen lassen. Dazu muss man einfach mit dem Mauszeiger auf diese Variablen zeigen.

Nun funktioniert das bei mir bei einigen Variablen einfach nicht. Finde auch kein Kriterium wonach das entschieden wird. ZB kann ich bei folgendem Codeabschnitt:


int Laufzeit;
            Laufzeit = Convert.ToInt32(DB_Main.Rows[DB_Main_y + 5][DB_Main_x + 5]);

            int Reputation_neu;
            Reputation_neu = Convert.ToInt32(DB_Main.Rows[DB_Main_y + 6][DB_Main_x + 5]);

die Variable Laufzeit problemlos anzeigen lassen. Die Variable Reputation_neu läßt sich leider nicht anzeigen. Auch ein rechtsklick mit Überwachung hinzufügen führt zu der Meldung:
Der Name Reputation_neu ist im aktuellen Kontext nicht enthalten.

Woran liegt das?

Gruß

06.11.2006 - 14:01 Uhr

Hallo,

würde gerne bevor ich eine Excel Sheet mit neuen Daten fülle, diese komplett löschen. Habe jetzt folgenden Code versucht:


OleDbConnection con2 = new OleDbConnection();
            OleDbCommand cmd2 = new OleDbCommand();

            con2.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=X:\Office\Excel\Kalki.xls; Extended Properties=""Excel 8.0;HDR=Yes""";
            
            //cmd2.CommandText = "INSERT INTO [Ergebnisse$](Verlust,Anzahl_V,Ertrag,Anzahl_E) VALUES(1,2,3,4)";
            cmd2.CommandText = "DELETE (Verlust) FROM [Ergebnisse$]";
            cmd2.Connection = con2;

            con2.Open();
            cmd2.ExecuteNonQuery();
            
            con2.Close();

Dies liefert aber leider die Fehlermeldung:
ISAM unterstützt das Löschen von Daten in einer verknüpften Tabelle nicht.

Irgendwie muss es doch möglich sein eine komplette Tabelle erstmal zu leeren. Meinetwegen auch indem überall "" geschrieben wird.

Kann mir jemand weiterhelfen?

Gruß

06.11.2006 - 11:23 Uhr

Hallo,

bin ziemlicher C# Neuling. Hab jetzt schon öfter bei der Zuweisung eines Strings den Klammeraffen @ gesehen. Sicher eine banale Frage, aber wofür steht dieser?

Gruß

03.11.2006 - 13:41 Uhr

Ja fürchte auch. Dachte das geht automatisch, wenn ich dieses commandbuilder Objekt einfüge. Zumindest steht das so in den Schinken, denn ich vor mir liegen habe.

Gibt es den keine "einfache" Möglichkeit ein Excel Datenblatt zu befüllen. Ich mein ohne (für mich) "komplizierte" SQL Update Anweisungen?

Gruß