Laden...
W
Walter Grimm myCSharp.de - Member
u.a. Entwickler Wuppertal Dabei seit 04.05.2006 25 Beiträge
Benutzerbeschreibung

Forenbeiträge von Walter Grimm Ingesamt 25 Beiträge

21.09.2009 - 09:30 Uhr

Danke Rainbird,

ich hatte jetzt zwischenzeitlich angefangen, eine kleine Lib zu schreiben, bin aber mit den Grundfunktionalitäten, die ich benötige, fast durch und werde sie dann erstmal nicht mehr weiter ausbauen, d.h. ich werde nicht mehr viel Zeit da reinstecken.

Die Lib erstelle ich an sich nicht für ein bestimmtes Projekt, sondern ich möchte sie allgemein in mehreren Projekten einsetzen, um mal eben auf die Schnelle nach Benutzervorgabe was nach Excel zu exportieren. Unter VB/A hatte ich mir seinerzeit schon sowas geschrieben, was mir bislang gute Dienste leistet.

Mit dem Umstieg nach 2003/2007 ist man hier leider sehr zögerlich, aber ich werde noch mal dahin drängeln. Zumal man hier auch darauf bedacht ist, alles mögliche als Webanwendung zu gestalten, ist es eh sinnvoll, mit den XML-features der neueren MS Office - Versionen zu arbeiten.

Danke für die guten Informationen, ich habe hier im Forum aus Deinen Beiträgen und der Office FAQ schon eine Menge Anregungen geholt.

15.09.2009 - 11:06 Uhr

Hallo zusammen,

Ich habe gestern mal angefangen, eine Wrapper - Lib zu schreiben, mit der ich via Late-Binding Excel 2000 steuern kann. Soweit so gut.

Bislang habe ich Excel via VB/A mit Hilfe einer eigenen Klasse gesteuert, was ja relativ gut geht.

Nun kommen mir aber schon erste Zweifel auf, ob das Sinn macht, zu versuchen, die Neue und Alte Welt dermaßen zu 'verheiraten'.

Ich benötige den Excelzugriff 'nur' für Exporte, muss also nicht iwelche vorhandenen Exceldateien auslesen.

Also habe ich angefangen, die einzelnen Excel - Objekte (Application, Workbook(s), Worksheet(s), Range, Font, Cell(s)...) nachzuempfinden und die Methoden, die ich benötige, zu implementieren. Das geht auch erstmal und umfasst natürlich beiweitem nicht annähernd das Excel-Objektmodell, logisch. Fehlen iwelche Methoden / Eigenschaften, können die ja nach und nach nachimplementiert werden.

Meine Fragen:

  1. Macht sowas generell Sinn oder ist es besser, für solche Aufgaben weiterhin VB/A zu bemühen und die entsprechende Software (eine VB- oder Access-Anwendung) aus dem in .Net geschriebenen Programm heraus zu starten?

  2. Ist es sinnvoll, das doch relativ komplexe Excel-Objekt-Modell so einigermaßen nachzuempfinden oder sollte man vielleicht Sachen vereinfachen bzw. zusammenfassen, so dass mehr oder weniger ein "eigenens vereinfachtes Objektmodell" ensteht?

  3. Kennt Ihr eine frei erhältliche Lib, bei der es sich lohnt, diese entsprechend aufzubohren bzw. anzupassen?

Die Verwendung von Excel 2000 ist leider vorgegeben. Könnte man Excel ab 2002 oder 2003 nutzen, könnte man sich ja die entsprechenden PIA`s runterladen, die wohl ziemlich vollständig sein sollen.

Und zum Schluss noch:
Gibt es eine gute Lib, bei der sich der Kauf lohnt? Entweder müsste diese ziemlich vollständig sein oder mit offenem (und auch verständlichen) Quellcode geliefert werden, so dass man Sonderwünsche noch nachimplementieren kann.
Ich hab zwar das eine oder andere beim Googlen gesehen, aber mehr fehlen die Erfahrungswerte. Vielleicht setzt ja jmd. von Euch sowas ein.
Excel ist bei und ein Standard-Controlling - Werkzeug. Nu muss ich noch zusehen, wie ich mit C# und Excel umgehe. Wie gesagt: Unter VB/A bis V 6.0 geht das alles recht problemlos.

10.09.2009 - 08:28 Uhr

Danke für Eure Antworten.

@Florian:
Ich werds dann mal so machen, wie Du beschreibst, d.h. die Werte werden erst beim Berechnen in Standardeinheiten umgesetzt.

@BerndFfm
Wenn die Rechnerrei zu teuer wird, werde ich tatsächlich die Werte redundant speichern. Aber ich hoffe erstmal, dass es mit Rechnen geht.

09.09.2009 - 11:36 Uhr

verwendetes Datenbanksystem: SQL - Server 2005

Hallo zusammen,

in einem Programm für die Grünflächenunterhaltung wird mit verschiedenen Maßeinheiten gearbeitet, die sich auf die 4 Grundeinheiten m (Meter), qm (Quadratmeter), cbm (Kubikmeter) und stck (Stück) herunterbrechen lassen.
Jetzt kann es sein, dass bei den Flächenmaßen (Grundeinheit: qm) auch Hektar u.a. verwendet wird.
Der User muss beim Anlegen neuer Maßeinheiten die Grundeinheit und den jeweiligen Faktor mit angeben, z.B. 1 Dutzend = 12 stck, 1 dzm = 0,1 m, 1 6Pack = 6 stck, usw. Ja, genau, es können also auch Eigendefinitionen (wieviel stck sind 1 Palette?) hinzugefügt werden. Soweit, so gut. Jetzt stellt sich für mich die Frage, ob ich beim Speichern in der DB immer die Grundeinheiten (m, qm, cbm, stck) speichern und beim Auswerten entsprechend durch den Faktor teilen soll oder ob ich die Einheiten speichere, wie sie sind (Hektar, Palette, 6Pack), um bei den Auswertungen durch Multiplikation mit dem Faktor auf die Grundeinheiten zu schließen, um verschiedene Flächenmaße wieder vergleichbar zu machen.

Wirr sind meine Worte? Ich hoffe, nicht allzusehr. Mir schwant aber, dass ich nicht der erste bin, der sich mit dem Thema Maßeinheiten und Datenbanken herumschlägt.

03.09.2009 - 13:23 Uhr

Jo, danke Dir, damit kann ich was anfangen.
Ich setze das Thema mal auf erledigt.

03.09.2009 - 10:29 Uhr

Sorry, ich stehe gerade mächtig auf dem Schlauch.
Ein Eingabevformat festzulegen alleine reicht nicht aus, oder?
Kann jmd ein bissl Code senden, nur ein kurzen Hinweis / Anschubser?
Sorry, aber irgendwie raff ichs net....

03.09.2009 - 09:23 Uhr

Danke,

ich werde es mal so testen. Wenns klappt, markiere ich das Dingen als erledigt, ansonsten frage ich noch mal nach.

03.09.2009 - 09:20 Uhr

Kommt jetzt ein wenig auf die Menge an, die sich im Grid befindet. Normalerweise sollte das aber mit einer SQL - Abfrage gehen, in der Art

SELECT f1, f2, f3 FROM MyTable WHERE Primärschlüssel in (x,y,z)

Den In - Teil kannst Du dir ja vorher zusammenstecken, indem Du übers DGV loopst und den Wert des Schlüsselfeldes ausliest.

Aber irgendwie vermute ich, dass das noch nicht den Kern Deiner Frage trifft.

  • Nur sichbar: Heißt das ohne die Daten, die man von weiter unten noch hochscrollen könnte?
  • Kannst Du den gesetzten Filter nicht einfach wiederverwenden ("SELECT... WHERE " + MyFilter)?

BTW. Warum muss man überhaupt neu laden, denn die Änderungen wurden doch im Grid gemacht und sind eh sofort sichtbar, oder geht u.a. auch darum, sicherzustellen, dass Änderungen, die andere evtl. gleichzeitig gemacht haben, sichtbar sind?

03.09.2009 - 08:35 Uhr

Hallo zusammen,

ich war lange nicht mehr hier und hab nun wieder die Gelegenheit, etwas mit C# zu proggen.

Aaaaalso:
Es geht darum, Zeiten in eine SQL - Server 2005 DB zu speichern. Dabei geht es nicht um Datum und Uhrzeit, sondern lediglich um Minuten und Sekunden.
Jetzt dachte ich mir, das ganze als Sekunden in der DB zu speichern.
Als Datentyp müsste eigentlich ein int gehen, da ich nur "ganze" Sekunden speichere.

In der Windows - Form soll die Eingabe über eine Textbox erfolgen, die an ein Property der Datenklasse (kein DataSet, meine Anwendung arbeitet mit typisierten Collections und Datenzugriffsklassen) gebunden ist.

Nun frage ich mich, ob man eine Textbox so verbiegen kann, dass man 01:30 Minuten eingibt und 90 Sekunden in das Objekt zurückgeschrieben werden und umgekehrt.

Oder ist es besser, der Datenklasse noch 2 Props (ZeitaufwandMinuten, ZeitaufwandSekunden) zu spendieren, 2 Textboxen entsprechend daran zu binden und in der Datenklasse die jeweiligen Umrechnungen in Sekunden bzw. wieder zurück mittels TimeSpan vorzunehmen?

Die dritte Variante wäre, einfach ein Minuten- und Sekundenfeld in die db mit aufzunehmen, finde ich aber nicht so gut, weils hinterher beim Rechnen umständlicher wird.

Noch mal zur Klarstellung:
Es geht nicht um Datum und/oder Uhrzeit, sondern lediglich um die reinen Minuten und Sekunden, die aber hinterher aufsummiert werden müssen.

Ach ja, wegen der Datenbindung:
Natürlich kann man das ganze ungebunden lösen, aber dann würden sich die Felder anders verhalten, als der (gebundene) Rest, da ich so einiges an Validierungsmethoden in den Klassen vorhalte und u.a. INotifyPropertyChanched implementiert habe usw. Daher sollte die Lösung datengebunden (also an das oder die Klassenprops) sein.

17.12.2007 - 23:27 Uhr

> Was wäre denn eine bessere Herangehensweise ?

Wenn Du selber was machen wilst, guck Dir mal ein paar offene Frameworks an. Z.B. unter www.codeproject.com gibt es einiges. Dann wäre da www.subsonicproject.com (das für und wieder hatten wir hier vor ein paar Wochen diskutiert). Oder bei www.mygenerationsoftware.com gibt es auch einiges. Ich hatte von dort z.B. eine ganze Zeit ein usGDO - Skript eingesetzt, weil es für mich sehr verständlich war und dann ziemlich aufgebohrt.
Zur Zeit 'schraube' ich ein wenig an subsonic herum. Dabei kann man eine Menge lernen.

15.12.2007 - 19:10 Uhr

Das DataSet ist eine Art In Memory - Datenbank und an sich recht mächtig. Es beinhaltet auch Möglichkeiten, Paralelitätsverletzungen nachzuhalten usw. usf., also eine richtige Datenbank.

Das Problem ist die Unübersichtlichkeit und die fehlende Typsicherheit. Dafür gibt es dann typisierte DataSets die man mit VS erzeugen kann bzw. andere Anbieter bieten ähnliches an.

Ein anderer Weg ist das Arbeiten mit Objekten. Ich arbeite lieber mit typsicheren Collections bzw. Objekten, die ich mir über einen Reader aus der DB hole. Setze Dich zu dieser Frage mal mit dem Thema objektrelationales Mapping (ORM) auseinander.

15.12.2007 - 14:54 Uhr

Hrm, falls nochmal jemand solch ein Problem hat - Lösen über einen VB Script ist eine schlechte Idee.

Man kann zwar die kostenlose Microsoft Office XP (Primary Interop Assemblies = PIAs) verwenden aber macht beim hinzufügen eines Scriptes sämtliche Virenscanner nervös und schlägt sich durch etliche Sicherheitsabfragen durch. Ein wirkungsvoller aber alter Ersatz ist dabei DAO X(

Unter .Net kannst Du die OleDB - Treiber verwenden und direkt mit ADO.Net auf die Access - Datenbank zugreifen. Du brauchst keine VB/A - Scripte dazwischen.
ADO.Net liefert Dir eigentlich alles, was Du benötigst, um direkt aus Deiner .Net - Anwendung auf eine Access - mdb zuzugreifen.
Oder Du lässt Dir den Code gleich zusammengenerieren, s. z.B. mal unter www.mygenerationsoftware.com, da gibt es auch Scripte, die Code für den Zugriff auf Access - Datenbanken generieren.

13.12.2007 - 14:31 Uhr

Hallo,

bist Du Dir sicher, dass

> value="NHibernate.Driver.SqlClientDriver"

richtig ist? Meiner Meinung nach ist das der Treiber für MS SQL - Server.
Ich weiß aber nicht, was da für MySQL stehen muss.

10.12.2007 - 11:47 Uhr

Ich halte das so, dass ich die Validierungen in die Klassen mit versenke.
Nur ganz rudimentäre Prüfungen (Datentyp etc.) werden von den Formularcontrols durchgeführt. Z.B. stelle ich 'meine' Textbox so ein, dass sie nur Zahlen aufnimmt, wenn es in der Klasse im ein Zahlenfeld geht.

Die Statusinformationen würde ich dem Formular entweder in einem überladenen Konstruktor mitgeben, oder je nachdem, um welche Art von Informationen es sich handelt, bei Bedarf bei der Validierung irgendwoher (Programmeinstellungen?...) laden.

Interessant im Zusammenhang mit Eingabevalidierung sind die Schnittstellen IDataErrorInfo und INotifyPropertyChanged.

Ich verwende (wenn auch mittlerweile abgewandelt) so etwas hier:
http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspx

01.12.2007 - 16:20 Uhr

...kannst du gegen jede DB programmieren und nahezu den gleichen Code benutzen.

Wenn Du einen OR-Mapper - verwendest oder einen CodeGenerator, der die jeweilige DB unterstützt, kannst Du Dir die entsprechende Datenzugriffsschicht gleich generieren lassen und dann ist es Dir fast Wurscht, was für ein RDBMS am anderen Ende ist.

Aber teste doch ruhig mal SQL Express aus, es sei denn, Du bist in Oracle oder DB2 fit.

19.11.2007 - 10:33 Uhr

...für den Tipp, ich werde es mir ansehen! 👍

18.11.2007 - 17:15 Uhr

> Durch das "ständige" neugenerieren der Datenzugriffsschicht
> ist es viel schwieriger
> Validierungen oder Workflows zu erstellen.

Das deckt sich z.T. auch mit meinen eigenen Erfahrungen. Ich habe zur Zt. ein von mir stark aufgebohrtes www.mygenerationsoftware.com - Script im Einsatz, welches relativ ähnlich zu SubSonic ist. Finde SubSonic an einigen Stellen eleganter, als meine eigene Lösung...

Bislang mache ich das so, dass ich die Business - Logik (und auch die Validierungen) in partiellen Klassen packe (das würde man bei SubSonic ähnlich machen). Ist dieser Ansatz total daneben?

Bei OR - Mappern bin ich bislang über deren Komplexität (NHibernate) gestolpert.

17.11.2007 - 14:06 Uhr

... der Beitrag, aber da die vorletzte Antwort von 15.11. ist, setze ich noch einen drauf 😉)

Schau Dir mal

www.subsonicproject.com

an (s. auch meinen heutigen Post dazu).

Das ist ein Codegenerator, der für ASP - Seiten optimiert ist und auch noch ein paar nützliche Controls mitbringt.

Lässt sich sehr einfach installieren. Ich hatte den ersten lauffähigen DAL nach 5 Minuten. Mit anderen Tools (z.B. NHibernate) brauche ich beim ersten Mal deuuuuuuuutlich länger.

Den OR-Mapper von Mirko kenne ich noch nicht. Werde ich mir aber auch ansehen.

17.11.2007 - 13:35 Uhr

verwendetes Datenbanksystem: SQL Server 2005

Hallo zusammen,

ich habe mir jetzt mal

www.subsonicproject.com

angesehen. Das ist ein Codegenerator für SQL Server, MySQL u.a., der einen DAL auf Grundlage des Activ - Record - Design - Patterns generiert.
Das Framework ist in erster Linie auf ASP ausgerichtet, man kann es aber auch für WinForms - Anwendungen verwenden.

Ich habe erste Tests mit WinForms - Anwendungen gemacht und bin bisher recht begeistert. Hat jemand Erfahrungen damit? Lohnt es sich, damit weiterzumachen?

Das FW ist OpenSource, erweiterbar und die Generator - Templates können verändert werden. Das Teil unterstützt Stored Procs hat aber auch einen konfortablen Query - Builder, mit dem man parametrisierte Inline - SQL - Abfragen an den Server absetzen kann. Sämtliche CRUD - Operationen und ein paar Standard - Querys werden gleich mit generiert.
Habe eine Testversion von SubSonic schon um ein Binding - Features erweitert (IEditableObject, IDataErrorInfo, INotifyPropertyChanged...).

Vielleicht ist dieser Beitrag aber auch für den einen oder anderen eine Anregung, sich SubSonic mal anzusehen 🙂).

17.11.2007 - 13:19 Uhr

Ich stimme den Vorrednern insoweit zu, dass Access nicht sonderlich sicher ist.
Performance - mäßig ist Access besser, als sein Ruf. Ich habe im Betrieb einige Access - Anwendungen seit Jahren am laufen, ohne dass es zu größeren Problemen kommt. Wir stellen aber jetzt aus Gründen der Sicherheit usw. nach und nach auf C#.Net / SQL Server um.

Passwortknackprogramme befinden sich zu Hauf im Internet. Kommt aber m.E. auf die User an. Sind es Privatleute, denen es 'einfach' reicht, wenn die Software läuft, reicht m.E. auch Access aus. Leute mit krimineller Energie kriegen alles irgendwie auf und können ggfls. auch dein Programm dekompilieren usw.

Access hätte den Vorteil, dass Du damit Deine Erfahrungen hasst.
Für den privaten Bereich ist ist eine Access - mdb/mde völlig ausreichend.

B.t.w:
Warum legst Du so großen Wert darauf, das Datenbankmodell vor dem Anwender zu verstecken? Was sollte der Anwender damit anfangen können? Ich kenne das bei vielen SW - Herstellern, dass diese das Datenmodell offenlegen.

18.10.2007 - 12:15 Uhr

Ich schätze mal, es liegt an den beiden Left - Joins.
Das DataSet weiß sehrwahrscheinlich nicht, was wohin gespeichert werden soll.
Führe das ganze mal testweise nur auf einer Tabelle (ohne die Left Joins) aus.

Ferner solltest Du Dir über Deine SW - Struktur Gedanken machen.
Datenzugriffsmethoden packt man normalerweise nicht direkt ins Formular, sondern kapselt diese in eine Datenzugriffsschicht.

Stichworte zum Googeln:
Schichtentrennung, 3 - Schichtmodell, Businesslogik, Datenzugriffsschicht, Präsentationsschicht usw.

Gruß

Walter

13.10.2007 - 16:50 Uhr

Ist mir noch nicht so aufgefallen.

Wenn ich ein ADO.Net - Command verwende, kann ich den Parameter auch mit
@Parametername benamsen, was ich auch viel besser finde, als dieses '?'

09.10.2007 - 21:28 Uhr

Wenn schon, dann in etwa so:


using System;
using System.Collections.Generic;
using System.Text;

namespace domination
{
    public class DbWork
    {
       // member 
       private string datei = Application.StartupPath + "\\domains.mdb";
       // properties
       public string DatenbankPfad
       {
            get {return this.datei;}
       }
    
    }
}

// Aufruf:
DbWork dbwork = new DbWork();
string meinedatei = dbwork.DatenbankPfad;

Generell solltest Du aber überlegen, solche Einstellungen in die dafür vorgesehene app.settings - Datei abzulegen.
Hier ist eine gute Einführung in C#, die auch das Thema Felder, Klassen, Properties usw. behandelt.

http://www.galileocomputing.de/openbook/visual_csharp/

09.10.2007 - 08:00 Uhr

Schau Dir mal die MZ - Tools an, die helfen dir, Code - Teile sehr schnell einzufügen.

http://www.mztools.com/index.aspx

Datenbankspezifischer Code:
Hier wäre die Überlegung, mal darüber nachzudenken, ob Du den Code nicht generieren kannst
www.mygenerationsoftware.com oder ob Du ein ORM - Tool
(NHibernate, Gentle usw.) einsetzen könntest.

04.10.2007 - 15:43 Uhr

Mein Problem ist jetzt dass ich die Schüler folgendermaßen in der ArrayList abgelegt habe:
Name;Vorname;Geschlecht;Telefon;Klasse

Genau das ist das Problem.
Ich würde in etwa wie folgt vorgehen:
1.
Klasse (oder ggfls. Struktur) 'Schueler' anlegen und die Angaben (Vorname, Nachname usw.) in Felder und Properties (Getter, Setter) verwalten.

2.
Dann anstatt des Array einfach eine generische Liste vom Typ List<Schueler> anlegen. Die hat schon fast alles, was Du brauchst.
(using System.Collections.Generics)

3.
Dann (falls Du die Sortierung 'nur' für die Schüler brauchst), entsprechende Comparer<Schueler> - Klassen bauen, für jede Sortiermöglichkeit eine.
Siehe auch in der Doku unter IComparer<T> (nicht IComparable<T>).

Gruß

Walter