Laden...
D
deerhunter myCSharp.de - Member
Anwendungsentwickler Dabei seit 31.10.2005 91 Beiträge
Benutzerbeschreibung

Forenbeiträge von deerhunter Ingesamt 91 Beiträge

11.12.2012 - 11:50 Uhr

Hallo roYaL-TS!

Ich kann dir bei deinem Problem leider nicht direkt weiterhelfen, möchte jedoch die Gelegenheit nutzen, dich auf OpenXML aufmerksam zu machen. Ich habe vor einiger Zeit damit erfolgreich Word-Dokumente im docx Format erstellt.

VG, Florian

02.10.2012 - 10:29 Uhr

Irgendwelche Ideen? Kann man mit einer foreach Schleife durch die Nodes springen und den Namen abfragen?

Hi SeCuRiiTaS!

Die Arbeit wird dir leider nicht vom Framework abgenommen, ist aber ganz leicht umzusetzen. Schau dir einfach mal diesen Artikel zu Tree-Traversal-Algorithm an. Damit kannst du alle Knoten abfragen und deine Suche leicht implementieren.

10.09.2012 - 08:49 Uhr

Ich freue mich schon auf Antworten!

Vor genau dem selben Problem stehe ich gerade auch. OK, das mit der Serialisierbarkeit habe ich nicht, aber auch ich muss eine Abfrage dynamisch zur Laufzeit anhand persistierter Parameter erstellen. Etwas richtig intelligentes ist mir auch nicht eingefallen, außer die Dynamic-LINQ library. Bin mal gespannt, ob jemand einen eleganteren Weg kennt, außer die magic-strings von Hand zu erstellen.

20.08.2012 - 08:03 Uhr

Du hast Recht, wenn du sagst, dass eine Klasse nicht von einem Interface erben kann. Sie kann dies nur implementieren. Da die Schreibweise im Quellcode jedoch identisch ist, sagen manche dies einfach so.

17.04.2012 - 16:53 Uhr

@all: Danke für eure Anregungen

@herbivore:

was spricht denn dagegen, einfach einmal pro Tag/Nacht per "Geplante Aufgaben" einen normalen Check-In der sowieso genutzten Versionsverwaltung laufen zu lassen.

Dagegen spricht gar nichts. Dachte nur, dass es vielleicht ein Tool gibt.
Ich werde mir wohl ein Skript schreiben, das mein git-repository automatisch aktualisiert. Die Idee mit dem Task gefällt mir gut.

17.04.2012 - 12:16 Uhr

Danke für den Hinweis bzgl. der rechtlichen Probleme. Perforce sprengt den Kostenrahmen für meinen Anwendungszweck leider deutlich.

17.04.2012 - 12:02 Uhr

Ja, stimmt. Mit dem FileSystemWatcher würde ich das hinbekommen. Ich habe damit auch schon gearbeitet.

Ich wollte jedoch vermeiden, das Rad neu zu erfinden und fragte daher, ob es schon ein Tool gibt, das mir diese Arbeit abnimmt. Die grundlegenden Funktionen sind ja nie die Zeitfresser bei der Programmierung - meist sind es die unvorhergesehenen Ausnahmen.

17.04.2012 - 10:53 Uhr

Hi!

Könnt ihr mir ein Tool empfehlen, das ein Verzeichnis überwacht und, sobald ein Benutzer eine Datei hinzufügt/ändert/löscht, einen Eintrag in einer Versionskontrolle erstellt?

Mein Ziel ist, Textdateien (meist sql-skripte, die zu Auswertungszwecken erstellt werden) zu archivieren und die Änderungen an diesen nachvollziehbar zu machen.
Wir haben hier einige Kollegen, die relativ fit in SQL sind, jedoch sicherlich nicht gewissenhaft git/svn bedienen würden. Daher mein Ansatz, sie gar nichts von der im Hintergrund laufenden Versionsverwaltung wissen zu lassen 😉

15.02.2012 - 13:13 Uhr

Ich habe das Buch nun schon zu einem großen Teil gelesen und möchte es an dieser Stelle gerne weiterempfehlen, da der Autor mir genau die Grundlagen vermittelt hat, die mir fehlten.

15.02.2012 - 11:45 Uhr

Na, da bin ich aber mal auf Lösungen gespannt. Mal schauen, ob mir eine clevere Idee kommt, wie man die Aufgabe lösen kann - vielleicht beim Joggen oder Duschen 😉

Edit: Ach ja, es wäre schön, wenn du ein paar Beispieldaten geben könntest, so dass man sich gleich auf die Problemlösung stürzen kann.

06.02.2012 - 13:40 Uhr

Ich weiß nicht, ob das Thema noch jemanden interessiert. Falls ja, kann ich euch wärmstens die Time Period Library empfehlen.

26.01.2012 - 09:07 Uhr

Hallo David!

Ich habe ein ähnliches Beispiel vor Kurzem im WPF-Buch von Thomas Claudius Huber gesehen.

Dort wurde es mit einem Grid und einem GridSplitter, den der Benutzer anfassen und verschieben kann, realisiert.
Mit diesen Stichworten solltest du erstmal weiterkommen.

VG, Florian

17.01.2012 - 08:25 Uhr

Auch von mir ein herzliches Dankeschön für die Links. Ist immer gut, sowas in der Hinterhand zu haben.

22.12.2011 - 15:07 Uhr

Hallo david.ka!

Danke für deine Empfehlung. Dieses Buch habe ich auch schon in die nähere Auswahl gefasst. Der Vollständigkeit halber sei erwähnt, dass es eine aktualisierte Version gibt.

22.12.2011 - 13:36 Uhr

Ich möchte euch um empfehlenswerte Literatur zum Thema WPF bitten.
Ich habe bereits das Buch "Pro WPF in C# 2010" von Matthew MacDonald (appress), weiß aber noch nicht so genau, was ich davon halten soll. Das Buch bleibt leider oft an der Oberfläche - im wahrsten Sinne des Wortes (sprich XAML)

Mich interessieren die Konzepte hinter der Technologie. So z.B. das Databinding. Es sieht ja schon recht imposant aus, wenn man im XAML-Code den Namen des Properties angibt und das Textfield bspw. dieses Property von den gebundenen Objekten ausliest. Allerdings stört mich daran, dass der Name des Properties als string im XAML-Code angegeben wird und somit "immun" gegen das automatische Refactoring vom VS/ReSharper ist.

Wenn ihr ein gutes Buch empfehlen könnt, das etwas mehr in die Tiefe geht und auf alltägliche Probleme bei der Entwicklung von Geschäftsanwendungen eingeht, dann immer her damit.

MfG, Florian

16.09.2011 - 10:43 Uhr

Hallo UweR,

ein Kollege von mir hatte dasselbe Phänomen. Wir sind vor kurzem mit der Firma umgezogen, wobei die IT (Server und Entwicklungsrechner etc.) am alten Standort geblieben sind. Daher arbeiten wir mit der Remote-Verbindung auf den Rechnern am alten Standort. Mein Kollege hat auf seinem alten Rechner noch WinXP - die Rechner am neuen Standort haben alle Win7.

Nur er hatte das von dir beschriebene Problem. Die Ursache ist wohl die mangelnde Grafikbeschleunigung von XP über die Remoteverbindung hinweg. VS2010 wurde ja mit WPF umgesetzt, so dass die Grafikkarte ein Flaschenhals sein kann.

Vielleicht hilft dir das weiter.

VG, Florian

P.S.: Ich habe zu Hause einen Mac mit VMWare-Fusion. Ich lasse Win7 in der VM laufen und habe überhaupt keine Probleme mit VS2010. Time to say goodbye to WinXP 😉

14.07.2011 - 23:57 Uhr

Hallo gfoidl!

Vielen Dank für diese Information. Das ist glaube ich genau das, was ich gesucht habe.

Gute Nacht!

14.07.2011 - 23:39 Uhr

Guten Abend!

Geht es euch auch so, dass ihr manchmal ein Denkspiel spielt und dabei unweigerlich darüber nachdenken müsst, wie man das wohl programmatisch lösen könnte?

So erging es mir letztens beim Spiel Unblock Me auf dem iPhone.
siehe Bild im Anhang bzw. Video (in schlechter Qualität) hier

Habt ihr eine Idee, wie man dieses Problem mit Hilfe eines Algorithmus angehen könnte? Ich könnte mir gut vorstellen, dass sich hierfür Dijkstra oder A* eignen. Mir fallen allerdings keine geeigneten Heuristiken ein, um die Kosten zu schätzen, die zum Ziel führen. Was sagt ihr dazu?

Ich würde mich über ein paar Anregungen von euch freuen. Leider kann ich nicht versprechen, zeitnah zu antworten, da ich gerade beruflich viel um die Ohren habe und bald im Urlaub bin.

VG, Florian

08.07.2011 - 16:23 Uhr

Hmm sieht sehr simple aus...

OT: Wie hättest du es denn gerne?
Passen dir die Farben?
Sonst noch Wünsche?

Ich bin raus.

Schönes Wochenende.

08.07.2011 - 15:55 Uhr

könntest du mal einen Screenshot anhängen wie das ganze dann aussieht?

Klar doch.
OT: Wie umständlich das mit den Screenshots immer bei Windows ist... Da gefällt mir mein Mac zu Hause viel besser 😉 Dies soll keine Aufforderung zum Flamewar sein. Nur eine Feststellung.

08.07.2011 - 15:31 Uhr

Hallo DennyW!

Das Thema hat mich auch interessiert. Mit WPF habe ich es hinbekommen. Schau dir doch mal mein Beispiel an und sag mir, ob es dir weiterhilft. Meines Wissens kann man auch in WindowsForms-GUIs WPF Elemente darstellen.

Da ich mich mit WPF nicht so gut auskenne, wäre ich für Verbesserungsvorschläge dankbar.

VG, Florian


<Window x:Class="WpfSegmentedProgressbarTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <Slider x:Name="slider1" Width="200" Height="50" Minimum="0" Maximum="1" Value="0.3"/>

        <Slider x:Name="slider2" Width="200" Height="50" Minimum="0" Maximum="1" Value="0.6" Margin="152,171,150,90" />
        <Rectangle Name="rectangle1" Stroke="Black" Width="200" Margin="152,12,0,0" Height="52" VerticalAlignment="Top" HorizontalAlignment="Left" RadiusX="25" RadiusY="50" >
            <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                    <GradientStop Color="Red" Offset="0"/>
                    <GradientStop Color="Red" Offset="{Binding ElementName=slider1, Path=Value}"/>
                    <GradientStop Color="Yellow" Offset="{Binding ElementName=slider1, Path=Value}"/>
                    <GradientStop Color="Yellow" Offset="{Binding ElementName=slider2, Path=Value}"/>
                    <GradientStop Color="Transparent" Offset="{Binding ElementName=slider2, Path=Value}"/>
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
    </Grid>
</Window>


24.06.2011 - 18:28 Uhr

Zum OpenXML-SDK gibt es ein Tool, mit dessen Hilfe du dir den Inhalt der OpenXML-Datei (docx etc.) anzeigen lassen kannst.
Dort gibt es auch ein diff-Tool, das maßgeschneidert auf diese Dateien ist.
Vielleicht kannst du deinem Fehler so auf die Sprünge kommen. Mich würde das Ergebnis interessieren, da ich auf der Arbeit auch mit OpenXML-Dateien arbeite.

VG, Florian

05.04.2011 - 12:20 Uhr

Hallo herbivore!

...
das geht am besten mit einem Profiler, aber das weiß du vermutlich. Ich wollte es nur zur Sicherheit schreiben.

Kannst du einen Profiler empfehlen?

Viele Grüße,
Florian

04.03.2011 - 12:10 Uhr

C# - Xml manipulation using XmlDocument

Ah, zu langsam.
Wie hilfsbereit hier heute doch alle beim Bedienen einer Suchmaschine sind 😉

01.03.2011 - 10:59 Uhr

Ja ich würde da dann beide Betriebsysteme im DualBoot installieren. Macht meines erachtens mehr sinn, als eines der beiden in einem vituellen System einzusperren.

Ich bekomme in den nächsten Tagen endlich mein neues MacBook und werde mir Win7 auch auf der Bootcamp-Partition installieren. Das coole daran ist, dass man mittlerweile mit VMWare-Fusion auch aus dem Betrieb von MacOS auf diese Partition zugreifen kann. Wenn man also nicht die volle Performance braucht, kann man also getrost auf den Neustart verzichten und mit beiden Betriebssystemen parallel arbeiten.

Ich persönlich möchte beim Alltagsgebrauch (surfen, Mails, Fotos, Musik) nicht mehr auf den Mac verzichten, habe aber immer noch die Freiheit mit Windows zu arbeiten.

01.12.2010 - 13:11 Uhr

Hallo Sponk!

Ich kann dir nur wärmstens das OpenXML-SDK von Microsoft empfehlen. Damit brauchst du dir gar keine Gedanken über die XML/string-Verarbeitung machen. Du kannst typsicher auf die ganzen Objekte im Dokument zugreifen.

Leider reicht meine Zeit nicht aus, um dir ein Beispiel zu geben, aber mit dem Stichwort solltest du Informationen finden.

OpenXML-SDK-Download

OpenXML Developer

Viele Grüße,
Florian

19.11.2010 - 10:43 Uhr

Hallo gfoidl!

Ich habe zwar nichts zum Thema beizutragen, möchte aber dennoch loswerden, dass ich deine Erklärung zu dem Thema sehr hilfreich fand.

VG, Florian

18.11.2010 - 14:52 Uhr
  1. Wozu brauche ich einen Clustered Primary Key?

Hmm, das war die Standard-Einstellung vom Datenbank-Designer, welche ich einfach übernommen habe.

  1. Gibt es eine Datenbank unabhängige Abfrage?

Das weiß ich nicht. Wie ich bereits geschrieben habe, bietet mySql bspw. mehr Komfort beim erstellen einer komma-separierten Liste.

VG, Florian

17.11.2010 - 09:42 Uhr

Ich habe jetzt mal eine Teillösung für MSSql erarbeitet. Mehr Zeit habe ich gerade leider nicht.
Damit solltest du weiterkommen.

VG, Florian


WITH x (Warenkorb_ID, ArtikelauflistungCsv) AS (
	SELECT DISTINCT(Warenkorb_ID)
		 , (SELECT SUBSTRING(
				 (SELECT ',' + CAST(Artikel_ID AS VARCHAR)
				   FROM dbo.FloWi_Warenkorb_Artikel b 
				  WHERE b.Warenkorb_ID = a.Warenkorb_ID
			   ORDER BY b.Artikel_ID
				  FOR XML PATH('')), 2, 200000)) AS ArtikelauflistungCsv
	  FROM dbo.FloWi_Warenkorb_Artikel a
  ) 
  SELECT * FROM (
	  SELECT x.*
		   , COUNT(*) OVER(PARTITION BY x.ArtikelauflistungCsv) AS AnzahlArtikelImWarenkorb
		 FROM x) AS y
		 WHERE AnzahlArtikelImWarenkorb > 1

Hier das Ergebnis:


Warenkorb_ID ArtikelauflistungCsv     
------------ -------------------------
1            1,2,3                    
3            1,2,3                    
5            1,2,3                    
6            1,2,3                    
2            1,3                      
7            1,3                      
4            2,4                      
8            2,4                      

(8 Zeile(n) betroffen)


Zuvor habe ich diese Tabellen angelegt.


CREATE TABLE [dbo].[FloWi_Warenkorb_Artikel](
	[Warenkorb_ID] [tinyint] NOT NULL,
	[Artikel_ID] [tinyint] NOT NULL,
 CONSTRAINT [PK_FloWi_Warenkorb_Artikel] PRIMARY KEY CLUSTERED 
(
	[Warenkorb_ID] ASC,
	[Artikel_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[FloWi_Artikel](
	[Artikel_ID] [tinyint] NOT NULL,
	[Bezeichnung] [varchar](20) NOT NULL,
 CONSTRAINT [PK_FloWi_Artikel] PRIMARY KEY CLUSTERED 
(
	[Artikel_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



und auch befüllt:



insert into FloWi_Artikel (Artikel_ID, Bezeichnung) values (1, Buch)
insert into FloWi_Artikel (Artikel_ID, Bezeichnung) values (2, Föhn)
insert into FloWi_Artikel (Artikel_ID, Bezeichnung) values (3, Bier)
insert into FloWi_Artikel (Artikel_ID, Bezeichnung) values (4, Schal)

INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (1, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (1, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (1, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (2, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (2, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (3, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (3, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (3, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (4, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (4, 4)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (5, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (5, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (5, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (6, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (6, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (6, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (7, 1)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (7, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (8, 2)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (8, 4)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (9, 3)
INSERT into FloWi_Warenkorb_Artikel (Warenkorb_ID, Artikel_ID) values (9, 4)


17.11.2010 - 08:40 Uhr

Hallo be4all,

da hast du dir aber eine interessante Fragestellung ausgedacht 😉
Ich bin mal gespannt, was die User hier für clevere Lösungen posten.

Hier unser Ansatz:

Im mySql gibt es die Funktion group_concat (siehe z.B. hier), mit deren Hilfe du Werte einer Zeile mit einem Separator verknüpfen kannst (analog zu String.Join(string separator, string[] entries) in c#.

Wenn du das jetzt nutzt um die Artikel jedes Warenkorbs aufsteigend sortiert und kommasepariert auszugeben, könntest du mit Hilfe dieses Ergebnisses nach Übereinstimmungen suchen.

Wenn jemand andere Ansätze hat, wäre auch ich daran interessiert.

VG, Florian

08.11.2010 - 12:59 Uhr

Liebe Freunde der NumericUpDowns!

Ich habe im Microsoft-Forum die Lösung zu dem Problem gefunden:


    private void NumericUpDown1KeyDown(object sender, KeyEventArgs e)
    {
      if (e.KeyCode == Keys.Return)
      {
        this.ActiveControl = numericUpDown2;
        e.SuppressKeyPress = true;
      }
    }


VG, Florian

08.10.2010 - 13:00 Uhr

Ahm,

mir stellt sich die Frage was willst du erreichen am ende?
Beschäftige dich mit den System-Tabellen vom MSSQL und du kannst die Tabellen-Scripte etc auslesen.

Das geht mitunter auch eleganter mit .net-Mitteln. Suche mal nach SMO (Server Management Objects). Ich habe damit schon einiges erreichen können.

Hier eine kleine Starthilfe.


      Server srv = new Server(SERVERNAME);
      srv.ConnectionContext.SqlExecutionModes = SqlExecutionModes.CaptureSql;

      Database db = srv.Databases[DATENBANKNAME];


Wenn du beim Serverobjekt den SqlExecutionMode auf CaptureSql stellst, dann kannst du auf Objektebene Operationen durchführen und diese mit bspw. table.Alter() an den Server schicken. (wird ja durch obige Option nicht zum Server geschickt, sondern nur aufgezeichnet.)

Anschließend kannst du den Sql-Befehl auslesen, der diese Operationen auf dem Server durchführen würde.


    //------------------------------------------------------------------------------------------------------------------------------------------------------------
    private static void InsertCapturedSqlCommandToStringbuilder(Server srv, StringBuilder sb)
    {
      sb.AppendLine();
      foreach (string s in srv.ConnectionContext.CapturedSql.Text)
      {
         sb.AppendLine(s);
      }

      srv.ConnectionContext.CapturedSql.Clear();
    }


Ich habe leider keine Zeit, meine Anwendung zu verfremden, so dass unsere Interna nicht mehr sichtbar sind. Aber mit diesen Stichwörtern solltest du arbeiten können.

Grüße, Florian

27.09.2010 - 11:05 Uhr
  1. erstelle eine Extensionmethod für Strings (z.B. .FromRessource)
  2. verwende suchen & ersetzen mit einem passenden Regexpattern zum suchen und dann das .FromRessource an jedem fest codierten string anzuhängen.

Hi JAck30|ena,

wollte dir nur mal kurz mitteilen, dass ich die Idee echt clever finde!

VG, Florian

20.09.2010 - 11:54 Uhr

<fun>
Haha, da muss ich doch glatt etwas schmunzeln. Aber stimmt, fürs iPhone kann man damit nicht entwickeln.
*duck und weg*
</fun>

15.05.2010 - 08:53 Uhr

Hallo Roland!

Danke für deinen interessanten Vorschlag. An COM-Schnittstellen habe ich gar nicht gedacht. Ich werde mich mal schlau machen und testen, wie viel Aufwand das ist.

Gruß,
Florian

Hallo Ralf,

danke für eine Empfehlung. Mal schauen, ob wir für die Lösung Geld in die Hand nehmen wollen. Ich werde den Vorschlag mit als Alternative in den Ideenpool einfließen lassen 😉

Gruß, Florian

13.05.2010 - 16:23 Uhr

Hallo zusammen!

Wir haben eine recht große Delphi-Anwendung, die irgendwann einmal vollständig nach c# migriert werden soll. Da jeder Weg mit einem ersten Schritt beginnt, wollen auch wir zunächst einzelne Teile auslagern.

Daher würde ich mich über Ideen freuen, wie man die Kommunikation zwischen einem laufenden Delphi-Programm und einer (auf den Startschuss) wartenden c#-Anwendung umsetzen kann. Es müssen nur wenige Details ausgetauscht werden (wie z.B. Datenbankname und -tabelle).

Wenn dann die c#-Komponente durchgelaufen ist, soll das Delphi-Programm von der c#-Komponente informiert werden.

Über Anregungen würde ich mich sehr freuen. Ich möchte keine fertigen Lösungen von euch, sondern lediglich Vorschläge und idealerweise Erfahrungen, die ihr mit dem Vorschlag gemacht habt.

Freundliche Grüße,
Florian

26.11.2009 - 15:19 Uhr

Hallo BerndFfm,

danke für deine Antwort.

Verschiedene Builds für verschiedene Datenbanksysteme halte ich nicht für sinnvoll. Wozu ?

Bei mir gibt man den Datenbankprovider beim Start an, z.B. MSSQL, Compact oder MySQL.

So wie du es beschreibst, habe ich es bislang auch eingerichtet. Funktioniert auch soweit.
Ich dachte, dass es vielleicht sinnvoll wäre, nur die dlls mitzuliefern, die auf dem Zielsystem auch wirklich Verwendung finden.

Grüße,
Florian

26.11.2009 - 14:16 Uhr

Hallo zusammen!

Ich habe eine Frage zur Einrichtung verschiedener Konfigurationen einer Anwendung, die mit verschiedenen Datenbank-Backends arbeiten soll.
(in meinem Fall Oracle und Oracle-Lite)

Ich habe einen generischen Datenbank-Layer geschrieben, der die verschiedenen Datenbanken ansprechen kann. Zur Design-Zeit muss ich natürlich für jeden DataLayer -- bzw. jede Ableitung der abstrakten Klasse -- die entsprechende DLL zur Verfügung haben (Oracle.DataAccess.dll und Oracle.DataAccess.Lite.dll).

Kann mir jemand eine Empfehlung geben, wie ich mein Projekt konfigurieren kann, um beim Deployment folgende Versionen zu erstellen

  • Build einer Anwendung für das Oracle-Backend (Verwendung der Oracle-Version des DataLayers mit Kopieren der Oracle.DataAccess.dll ins Build-Verzeichnis)
  • Build einer Anwendung für das Oracle-Lite-Backend (Verwendung der OracleLite-Version des DataLayers mit Kopieren der Oracle.DataAccess.Lite.dll ins Build-Verzeichnis)
  • Beibehalten des VS-Supports (Intellisense etc.)

Ist es sinnvoll, verschiedene Projekte anzulegen (jeweils ein Hauptprojekt für jeden unterstützten DataLayer), die dann jeweils auf die entsprechenden dlls verweisen?

Ich würde mich über Konfigurationsansätze freuen, wie ihr ein solches Prolem löst.
Eine andere Problemstellung wäre natürlich auch denkbar, wie z.B. Demo-Version und Voll-Version eines Projekts.

  • Florian
25.08.2009 - 13:46 Uhr

Hallo Easyrider!

Ich finde dein Programm ganz nützlich. Danke, dass du es zur Verfügung stellst.
Einen Hinweis hätte ich noch:
Es wäre "besser", die XML-Struktur wie folgt aufzubauen (siehe Vergleich unten).
Damit erleichterst eine programmatische Verarbeitung, die bspw. auf xsd basiert.
In deiner Implementierung gibst du den Unterknoten, die die Übersetzung enthalten, einen Namen; besser wäre jedoch, wenn diese vom gleichen Typ wären und den Key als Attribut des XML-Elements enthalten würden.


<Translation>
  <GUI>
    <mnuFile>
      <Value>&Datei</Value> 
      <Description>Menüpunkt Datei.</Description> 
    </mnuFile>
  </GUI>
</Translation>


<Translation>
  <GUI>
    <guiTranslation key="mnuFile">
      <Value>&Datei</Value> 
      <Description>Menüpunkt Datei.</Description> 
    </mnuFile>
  </GUI>
</Translation>

Interessant wäre hierzu für dich vielleicht linq2xsd. Damit kann man ein xsd-Schema zu einem .net-Projekt hinzufügen und erhält nach einmaligem Kompilieren eine Objektstruktur, die auf diesem Schema basiert.
Man kann XML-Dateien einlesen, neue erstellen etc. alles auf Basis der Objektstruktur. Ist also vergleichbar mit einem OR-Mapper.

Viele Grüße,
Florian

08.08.2009 - 10:03 Uhr

Hallo zusammen, bezüglich linq, habt ihr ein gutes Tutorial zu empfehlen das die Sache mal genauer erklärt, eventuell mit Beispielen?

Eine umfangreiche Auflistung vieler Beispiele findest du auch hier.

Ist schon teilweise recht elegant, was man mit LINQ erreichen kann.

10.06.2009 - 21:52 Uhr

Schönen guten Abend!

Ich habe herausgefunden, dass NUnit genau das kann was ich möchte. Ich habe ein Beispiel unten angehängt. Falls jemand weiß, ob und wie man dieses auch mit den Test-Tools vom VS2008 erreichen kann, würde ich mich über eine Antwort freuen.

VG, Florian

Hier die zu testende Beispielklasse:



namespace FactorySample {
    public enum DatabaseProvider {
        Oracle,
        Microsoft
    }

    public abstract class DAL {
        public abstract string GetParameterNameForUseInSqlString(string parameterName);

        public static DAL CreateDAL(DatabaseProvider provider) {
            switch (provider) {
                case DatabaseProvider.Oracle:
                    return new OracleDAL();
                case DatabaseProvider.Microsoft:
                    return new MicrosoftDAL();
                default:
                    return null;
                    break;
            }
        }
    }

    public class OracleDAL : DAL {

        public override string GetParameterNameForUseInSqlString(string parameterName) {
            return string.Format(":{0}", parameterName);
        }
    }

    public class MicrosoftDAL : DAL {

        public override string GetParameterNameForUseInSqlString(string parameterName) {
            return string.Format("@{0}", parameterName);
        }
    }

}



und hier die Testklasse:


using System;
using NUnit.Framework;
using FactorySample;

namespace UnitTests {
    //die Attributwerte werden an den Konstruktor der Testklasse übergeben
    [TestFixture(DatabaseProvider.Microsoft, "@")] 
    [TestFixture(DatabaseProvider.Oracle, ":")]
    public class DataLayerTest {
        private DAL dataLayerToTest;
        private string parameterPrefixForProvider;

        public DataLayerTest(DatabaseProvider testProvider, string parameterPrefixForProvider) {
            this.dataLayerToTest = DAL.CreateDAL(testProvider);
            this.parameterPrefixForProvider = parameterPrefixForProvider;
        }

        [Test]
        public void ParameterTest() {
            Console.WriteLine("Testing class {0}", this.dataLayerToTest.GetType());
            string testParamterName = "foo";
            string result = this.dataLayerToTest.GetParameterNameForUseInSqlString(testParamterName);
            Console.WriteLine("result: " + result);
            Assert.AreEqual(
                this.parameterPrefixForProvider + testParamterName,
                result);
        }
    }
}


09.06.2009 - 16:23 Uhr

Hallo zusammen!

Ich habe eine Datenzugriffsklasse erstellt, die mehrere Datenbankprovider unterstützt. Mit Hilfe einer Factory lasse ich die entsprechende Instanz erzeugen.

Ich habe ein Unit-Test Projekt für die Datenbankklasse erstellt. Getreu dem DRY-Prinzip möchte ich nicht mehrere verschiedene Testklassen für die _verschiedenen _Datenbankprovider erstellen.

Habt ihr eine Idee, wie ich _alle _Tests einer Testklasse für _jeden _meiner unterstützten Datenbankprovider durchlaufen lassen kann?
Es ist ja irgendwie "unschön", wenn man in jeder Testmethode durch eine Liste mit Instanzen der jeweiligen Datenzugriffsklasse iteriert...

Ich hoffe ich habe mich verständlich ausgedrückt und habt eine Idee, wie ich dies möglichst elegant lösen kann.

Viele Grüße, Florian

13.08.2008 - 18:13 Uhr

Hallo herbivore,

Wenn du wissen willst, welche Kombinationen von Basiswerten GrantLevelBase dahinterstecken verwenden ein Dictionary<GrantLevelCombined, GrantLevelBase>, in das du genau das einträgst.

danke für deine Antwort. Ich habe schon so etwas befürchtet 😉
Falls jemand noch eine andere Idee hat - immer her damit.

MfG

13.08.2008 - 18:01 Uhr

Hallo zusammen!

Ich hätte gerne so etwas wie einen enum-Konstruktor bzw. eine vernünftige Art, ein BitFlagEnum zu erzeugen.
Am einfachsten kann ich das anhand eines kleinen Beispiels erklären:

Ich bekomme eine Zahl von 1-5, die einen GrantLevel auf eine Datenbank darstellt.

select = 1,
select_insert = 2,
select_update = 3,
select_insert_update = 4,
select_insert_update_delete = 5

Da die Verwendung dieser Zahlen im Programmcode ungünstig, ist mir bewusst und ich würde gerne ein BitFlag-Enum verwenden, um die Verarbeitung zu erleichtern und abzusichern.


    [Flags]
    public enum GrantLevel
    {
        select = 1,
        insert = 2,
        update = 4,
        delete = 8,

        select_insert = GrantLevel.select | GrantLevel.insert, 
        select_update = GrantLevel.select | GrantLevel.update,
        select_insert_update = GrantLevel.select | GrantLevel.update | GrantLevel.insert,
        select_insert_update_delete = GrantLevel.select | GrantLevel.update | GrantLevel.insert | GrantLevel.delete
    }

Könnt ihr mir sagen, wie ich am komfortabelsten z.B. von der 4 auf GrantLevel.select_insert_update komme?

Ideal wäre natürlich, wenn ich einen expliziten Cast von einer enum zur anderen machen könnte.
Über Ideen, Denkansätze bzw. Stichwörter für eine Suche würde ich mich sehr freuen.

MfG

04.08.2008 - 14:18 Uhr

Hallo kleines_eichhoernchen!

Zum Beispiel läuft das .NET Framework zusätzlich unter Linux/Unix-ähnlichen Betriebssystemen. Das ganze nennt sich
>
und ist in sehr vielen Teilen kompatibel zum Microsoft .NET. ...

Danke für die Information! Ich verwende solche Methoden ohnehin aus Gewohnheit - jetzt weiß ich auch, wofür dies gut ist und sich u.U. auszahlt 😉
Werde dann bald mal versuchen, ein .net Programm auf meinem MacBook auszuführen. Bin ja mal gespannt.

04.08.2008 - 11:07 Uhr

Warum verwendest du für einen Zeilenumbruch nicht StreamWriter.WriteLine()? Dort ist kann es dir egal sein, wie der zeilenumbruch aussieht. Weiterhin von Vorteil, wenn du auf ein anderen Betriebssystem portieren musst, musst du nicht dein Quellcode anpassen

Dazu habe ich mal eine Frage: Auf welchem anderen OS läuft denn .net sonst noch, welches nicht \r\n verwendet? Alle Windows Betriebssysteme verwenden dies doch für den Zeilenumbruch, oder?

11.07.2008 - 14:20 Uhr

Ich hab es jetzt hinbekommen, musste dafür allerdings die Oracle.DataAccess Library verwenden. Hiermit kann man ein returning-Statement weiterverarbeiten.


string insertOracle = "INSERT into task (TASK_NAME, TASK_NOTES) values (:1, :2) returning rowid into :3";
//...
OracleParameter p = new OracleParameter("returnValue", OracleDbType.Varchar2, 30);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);

Mit dem OleDB-Treiber bekomme ich eine Exception

ORA-00439: feature not enabled: RETURNING clause from this client type

Mal schauen, ob ich die Oracle-Treiber verwenden kann, oder ob wir die Datenschicht austauschbar halten müssen.

Danke für eure Vorschläge.

11.07.2008 - 10:02 Uhr

verwendetes Datenbanksystem: <Oracle - Zugriff mittels OleDB>

Ich benötige Hilfe beim Auslesen der ID des eingefügten Datensatzes. Bei Oracle gibt es ja keine AutoIncrement-Spalten, sondern die Werte werden mittels Trigger/Sequenz gesetzt - in meinem Fall die ID und die CREATED_AT Spalte.

Mit folgendem SQL-Befehl komme ich an die RowID des eingefügten Datensatzes heran:


DECLARE 
r rowid;
BEGIN 
  insert into task (TASK_NAME, TASK_NOTES) values ('foo', 'bar') returning rowid into r;
  DBMS_OUTPUT.PUT_LINE(r);
END;

Könnt ihr mir sagen, wie ich an die rowid aus c# heran komme?

Das ganze soll generisch sein (d.h. das Insert-Statement soll dynamisch erstellt werden) und somit kann ich keine Function/SP für _jede _Tabelle anlegen - oder kann man einen Insert-Befehl als Parameter an eine Function/SP übergeben?

03.07.2008 - 11:13 Uhr

Mich würde interessieren, wie ihr die GUI mit dem Programm verknüpft.
Konkret an einem Beispiel: "Befindet sich der Datensatz im Editiermodus, dann sind die Accept- und Decline-Buttons aktiv, die Buttons für Add-New und Edit-Row jedoch nicht".

Wie geht ihr vor?

Ich benutze z.Zt. Enums, in denen ich jeden möglichen Status der Anwendung eintrage und dann in einer Methode die Controls entsprechend des Programmstatus' aktiviere.

Eure Ideen, Ansätze ("Best Practices) würden mich sehr interessieren.