Laden...
Avatar #avatar-2880.jpg
Florian Reischl myCSharp.de - Experte
Softwarearchitekt, Technischer Projektleiter München Dabei seit 16.10.2007 1.564 Beiträge
Benutzerbeschreibung

Forenbeiträge von Florian Reischl Ingesamt 1.564 Beiträge

10.01.2010 - 22:54 Uhr

Irgendwie werde ich alt...

10.01.2010 - 18:57 Uhr

Hallo Lars

Linq 2 DataSets darfst du nicht überschätzen. Das ist einfach eine vereinfachte Schreibweise für Funktionalitäten welche unter 2.0 bereits vorhanden sind. .NET 3.5 ist insgesamt ja kein eigenständiger Framework, sondern erweitert nur .NET 2.0.

Zu den Pivots:
Wenn ihr mit SQL Server arbeitet empfehle ich die PIVOT Funktion nicht zu verwenden. Die ist unflexibel und langsam. Klassische Cross-Table Queries sind da wesentlich mächtiger und auch schneller. Hierzu kann ich sehr die folgenden Artikel von Jeff Moden empfehlen:
Cross Tabs and Pivots, Part 1 – Converting Rows to Columns
Cross Tabs and Pivots, Part 2 - Dynamic Cross Tabs

Wenn ihr aber sehr viel mit Pivot arbeitet würde ich aber empfehlen mal über SSAS (SQL Server Analysis Services) nachzudenken. Der ist genau darauf ausgelegt und lässt als multidimensionale Datenbank beim Thema Auswertungen und Analysen mit Aggregaten jedes RDBMS auf verlorenem Posten.

Grüße
Flo

10.01.2010 - 18:23 Uhr

Hallo Lars

Das geht nicht! Glaubts mir einfach...

Glaub' ich nicht. Von normalen relationalen Datenbanken über De- oder Über-Normalisierten Datenbanken bis hin zu EAV/CR Designs habe ich schon so ziemlich mit allem zu tun gehabt. "Geht nicht" gibt's schlicht nicht, wenn du ein richtiges RDBMS hast.

Zu deiner Frage:
Das "View"-Objekt in Verbindung mit dem DataSet ist die DataView. Die ist jedoch 1:1 an eine darunterliegende DataTable gebunden, heißt du kannst hier keine anderen Tabellen mit reinpacken. Wenn's um simple Parent/Child Spalten geht kannst du über Expression-Columns die entsprechenden Spalten an eine bestehende DataTable anhängen.

         DataSet ds = new DataSet();
         
         DataTable parent = new DataTable();
         parent.Columns.Add("Id", typeof(int));
         parent.Columns.Add("SomeText", typeof(string));
         parent.PrimaryKey = new DataColumn[] { parent.Columns["Id"] };
         ds.Tables.Add(parent);

         DataTable child = new DataTable();
         child.Columns.Add("Id", typeof(int));
         child.Columns.Add("ParentId", typeof(int));
         child.Columns.Add("SomeText", typeof(string));
         child.PrimaryKey = new DataColumn[] { child.Columns["Id"] };
         ds.Tables.Add(child);

         ds.Relations.Add(parent.Columns["Id"], child.Columns["ParentId"]);
         parent.Rows.Add(1, "foo");
         child.Rows.Add(1, 1, "bar");

         child.Columns.Add("ParentText", typeof(string), "Parent.SomeText");

         DataRow row = child.Rows[0];
         foreach (var item in child.Rows[0].ItemArray) {
            Console.WriteLine(item);
         }

Mehr kann das DataSet nicht.

Grüße
Flo

09.01.2010 - 21:39 Uhr

Die Möglichkeit in einem Interface einen Constructor zu definieren. Mit ISerializable zeigt .NET recht schön, dass das Feature manchmal nicht schlecht wäre.

07.01.2010 - 15:14 Uhr

Naja, "die schwere Nuss" ist's zwar nicht wirklich, eher ein ganzer Sack voller leichter unt schwerer Nüsse, aber...

Nach 1 1/2 Jahren und mehr als 2.000 Aufwandstagen das neue System für meinen Kunden als Technischer Projektleiter, Softwarearchitekt und mitwirkender Entwickler aus dem Boden zu stampfen.

Das war auf jeden Fall ein großer Meilenstein für mich und die ganze Firma (weil's unser bisher größtes Projekt war).

EDIT: Fast vergessen...

@dr4g0n76:
Nachdem du die Diskussion ja vom Zaun gebrochen hast, was war denn deine schwerste Nuss? 😉

Grüße
Flo

07.01.2010 - 11:16 Uhr

Hallo Yheeky

Naja, "" ist nicht besonders aussagekräftig. Beschreib' doch mal genau bei welcher Aktion du einen Fehler bekommst und was du da ggf. vorher schon getan hast.

Grüße
Flo

06.01.2010 - 21:28 Uhr

Die Parallel Extensions gibt's auch für VS 2008. Das ist einfach nur eine Assembly, die man referenzieren kann/muss. Funktioniert mit Frameworkversion 2.0.

Meinst du jetzt das 4.0 Assembly? Wenn ja, dann bleibt's ne BETA die man produktiv nicht einsetzen sollte. Wenn nein, welche DLL meinst du?

Grüße
Flo

06.01.2010 - 20:26 Uhr
PostEngine engine = new MyCSharpEngine();
ForumThread thread = engine.GetThread(80187);
ThreadPost post = thread.Posts[2];
string myPost = post.Content.Replace("gäbe es da", "gäbe es ab Visual Studio 2010");
myPost += "\r\n" + engine.Emotions("BigGrin");
myPost += GetSignature();
thread.Posts.Add(myPost)

Ansonsten gäbe es ab Visual Studio 2010 noch die Parallel Extensions, die schon parallele Schleifen enthalten
😁

Grüße
Flo

06.01.2010 - 20:00 Uhr

Hi

Ich habe diesen Thread jetzt viele Tage verfolgt und auch viel über die unterschiedlichen Meinungen zu Vorsätzen im Allgemeinen nachgedacht. Ich bin für mich zu dem Entschluss gekommen, dass ich Vorsätze für ein kommendes Jahr durchaus okay und auch gut finde, wobei ich hier unterschiedliche Arten von Vorsätzen unterscheide.

Bei Vorsätzen wie "ich höre auf zu Rauchen", "ich will mehr Sport machen" schließe ich mich der Vielzahl von Vorrednern(/Vorschreibern) hier an. Wenn du was machen willst dann tu es. Genauso Vorsätze mit denen man sich vor sich selbst irgendwie für etwas entschuldigen will wie "ich will mehr mit Freunden/Freund(in)/Familie machen" oder "ich will jetzt wieder ins Fitnesscenter gehen" finde ich nicht gut. Zuletzt halte ich nicht viel von abstrakten/nicht messbaren Vorsätzen wie "ich will mich weiterbilden" oder "ich will mehr Artikel schreiben".

Vorsätze wie "ich letztes Jahr WCF gelernt und will heuer mein Wissen zu durable Services vertiefen" finde ich gut weil sie an einen bereits bestehenden Erfolg anknüpfen und damit ein bereits erreichtes Ziel ausbauen. Auch Vorsätze wie "ich will 3 Artikel für myCSharp.de schreiben" oder "ich will meine Freundin im Sommer mit einer Städtereise nach XYZ überraschen können" finde ich gut, weil sie messbar sind.

Zudem sollte man sich solche Vorsätze nicht nur am 01.01. um 00:04 nach ein paar Bier o.Ä. aufsagen, sondern notieren und am Ende des Jahres prüfen was man erreicht hat und was nicht (und warum nicht).

Also zu meinen Vorsätzen für 2010 😃*Ich will mindestens 30 neue Blog-Einträge schreiben *Ich will .... <- den kann ich nicht öffentlich schreiben 😉 *Ich will drei Artikel bei Internet-Communities (wie myCSharp.de) publizieren *Ich will an mindestens 3 PASS Treffen in Bayern teilnehmen

Grüße
Flo

06.01.2010 - 15:16 Uhr

Hallo berokama

da nicht sehr viel zu speichern ist habe ich mich für eine lokales sdf File entschieden.

Ich weiß jetzt nicht wie viel "nicht viel" ist, aber vielleicht ist ein DataSet oder normle Xml-Serialisierung auch eine Option.

Grüße
Flo

05.01.2010 - 18:28 Uhr

Unabhängig von Glaubenskriegen nur ein Hinweis:

Je Dynamischer, desto komplexer.

... und je komplexer desto schwerer zu warten.

Regel sollte sein:

Keept it simple but not as simple as possible

Grüße
Flo

05.01.2010 - 16:12 Uhr

Hallo marv100

Für einen reinen Entwickler-PC würde ich erstmal erstmal an herbivore anhängen und sagen nimm irgendwas.

Bei deinen weiteren Anforderungen würde ich die Sache wiederum einschränken:

Arbeiten in ein oder mehreren VMs
genügend Speicherplatz für die VMs

Bei mehreren VMs gleichzeitig wird - wie Jelly geschrieben hat - eine einzelne Festplatte schnell zum Flaschenhals. Besorg' dir für die VMs entweder eine zweite Platte oder nimm sogar ein RAID.

Als RAM empfehle ich jetzt mal 8GB. Habe ich zu Hause und habe damit keinerlei Probleme mit Virtualisierung, auch wenn eine VM (z.B. ein DB-Server) mal mehr speicher brauchen.

größtenteils Webdesign (mit VS2008)
Musik und Videos abspielen
Videos vielleich auch in HD
WLAN

Habe zwar keine Ahnung von HD-Anforderungen aber ansonsten würde ich sagen, dass diese Anforderungen so zu ziemlich jedes Net-Book oder iPhone erfüllt 😄

soll ein paar Jahre halten

... also anständig damit umgehen 😉

nicht zu teuer 😉

Ich habe mir meine Möhre vor ca. 1 Jahr bei RocketPC besorgt. Ging alles schnell und Problemlos. Außerdem finde ich die Preise für Nicht-Gamer-PCs fair.

Grüße
Flo

04.01.2010 - 14:24 Uhr

Hallo Narnaja

Es kommt darauf an, welchen Weg du einschlagen willst.

Wenn du dich mit ADO.NET wirklich auskennen willst würde ich dir die SqlConnection (oder eine andere Connection - abhängig vom DBMS) empfehlen. Egal ob mit DataReader oder DataSet/DataTable lernt man hier zu verstehen wie die ganze Sache funktioniert.

Wenn's dir eher um das Abbilden der Datenbank in einem Objektmodell geht bei dem du (möglichst) wenig mit der Datenbank zu tun hast würde ich einen O/R-Mapper wie LINQ2SQL oder Entity Framework empfehlen. (NHibernate in deinem Fall nicht, weil's zu lang dauert bis man drinnen ist und keine schicken Designer gibt.)

Grüße
Flo

PS: Bei dem "Tackt" beachten: Samba ist 2/4, wird aber oft mit 4/4 verwechselt. DiscoFox wird zwar 3/4 getanzt, ist aber 4/4. 😄

04.01.2010 - 13:14 Uhr

Hallo Neokil

Stimmt, hatte Die Win-Controls und die "geniale" Event-Unterstützung vergessen...

Versuch's aber mal so:

   class FooBox : TextBox {
      private const int WM_PAINT = 0x000F;

      protected override void WndProc(ref Message m) {
         base.WndProc(ref m);
         if (m.Msg == WM_PAINT) {
            if (string.IsNullOrEmpty(this.Text)) {
               using (Graphics gfx = this.CreateGraphics()) {
                  gfx.DrawString("Bar", this.Font, Brushes.Black, new PointF(0f, 0f));
               }
            }
         }
      }

      protected override void OnTextChanged(EventArgs e) {
         base.OnTextChanged(e);
         if (string.IsNullOrEmpty(this.Text))
            this.Invalidate();
      }
   }

Grüße
Flo

04.01.2010 - 13:02 Uhr

Hallo Rainer

Also ganz ohne kopieren wirst du nicht auskommen.

Du kannst deinen Byte-Array auch in einen StringBuilder kopieren, darin deinen Text nach belieben bearbeiten und am Ende wieder zurückkopieren.

Das bedeutet zwar mindestens viermal kopieren (byte[]->string->StringBuilder->string->byte[]), ist aber sehr optimiert bei mehreren String-Manipulationen innerhalb des StringBuilders.

Grüße
Flo

04.01.2010 - 12:47 Uhr

Hallo Bubblegum

Die "Katastrophe" hängt erstmal davon ab wie oft sich dein Text oder die Größe deines Rectangles ändert. Wenn die Werte relativ statisch sind kannst du die Informationen einmal berechnen und wiederverwenden.

Wenn die Werte sich die ganze Zeit ändern (z.B. in einer Animation), dann kannst du dir einmal ermittelte Informationen, wie die Größe von Buchstaben einer bestimmten Schrift und Größe, cachen und wiederverwenden. Um zu vermeiden, dass der Speicher voll läuft kannst du einen Ringbuffer verwenden.

Grüße
Flo

04.01.2010 - 12:43 Uhr

Hallo Neokil

Blöde Frage, aber warum erbst du nicht einfach von der normalen TextBox und überschreibst die OnPaint?

Grüße
Flo

04.01.2010 - 12:41 Uhr

Entweder MSMQQueueClass verwenden oder eben Casten (wie die Fehlermeldung sagt).

Fällt übrigens unter:
[Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Grüße
Flo

04.01.2010 - 12:38 Uhr

Gibt's viele verschiedene Möglichkeiten.

* Du kannst den Int-Wert z.B. in die Tag Property der CheckBoxen eintragen.
* Du kannst ein Dictionary mit den entsprechenden CheckBoxen als Key und dem Int-Wert als Value verwenden.
(* In beiden Fällen einen einzelnen Event-Handler für alle CheckBoxen)
* ...

BTW: Du solltest solche Sachen nicht im OnPaint ermitteln, da du dass dann zig 1000mal machst. Schreibe dir den zustand stattdessen in deine Member-Variable, wenn sich der Wert ändert.

Grüße
Flo

04.01.2010 - 11:44 Uhr

Hallo

Hier eine Klasse die ich seit Jahren verwende:

   /// <summary>
   /// To map a network path by UNC path to a local drive letter.
   /// </summary>
   public static class DeviceConnector
   {
      #region API

      [DllImport("mpr.dll")]
      private extern static NetworkErrorCode WNetAddConnection2A(
         [MarshalAs(UnmanagedType.LPArray)] NETRESOURCEA[] lpNetResource,
         [MarshalAs(UnmanagedType.LPStr)] string lpPassword,
         [MarshalAs(UnmanagedType.LPStr)] string lpUserName,
         int dwFlags);

      [DllImport("mpr.dll")]
      private extern static NetworkErrorCode WNetAddConnection3(
         IntPtr hwndOwner,
         [MarshalAs(UnmanagedType.Struct)] ref NETRESOURCEA lpNetResource,
         [MarshalAs(UnmanagedType.LPStr)] string lpPassword,
         [MarshalAs(UnmanagedType.LPStr)] string lpUserName,
         int dwFlags);


      [DllImport("mpr.dll")]
      private extern static NetworkErrorCode WNetCancelConnection(
         [MarshalAs(UnmanagedType.LPStr)] string lpName,
         bool fForce);

      [StructLayout(LayoutKind.Sequential)]
      private struct NETRESOURCEA
      {
         public int dwScope;
         public int dwType;
         public int dwDisplayType;
         public int dwUsage;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpLocalName;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpRemoteName;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpComment;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpProvider;
      }

      // Resource type
      private const int RESOURCETYPE_ANY = 0x00000000;
      private const int RESOURCETYPE_DISK = 0x00000001;
      private const int RESOURCETYPE_PRINT = 0x00000002;

      private const int CONNECT_UPDATE_PROFILE = 0x00000001;
      private const int CONNECT_UPDATE_RECENT = 0x00000002;
      private const int CONNECT_TEMPORARY = 0x00000004;
      private const int CONNECT_INTERACTIVE = 0x00000008;
      private const int CONNECT_PROMPT = 0x00000010;
      private const int CONNECT_NEED_DRIVE = 0x00000020;
      private const int CONNECT_REFCOUNT = 0x00000040;
      private const int CONNECT_REDIRECT = 0x00000080;
      private const int CONNECT_LOCALDRIVE = 0x00000100;
      private const int CONNECT_CURRENT_MEDIA = 0x00000200;
      private const int CONNECT_DEFERRED = 0x00000400;
      //private const int CONNECT_RESERVED = 0xFF000000;
      private const int CONNECT_COMMANDLINE = 0x00000800;
      private const int CONNECT_CMD_SAVECRED = 0x00001000;

      #endregion

      #region Connect

      /// <summary>
      /// Connects a new network drive. If the current user has no permissions to the specified path he will be asked for permissions.
      /// This can be null.
      /// </summary>
      /// <param name="hwndOwner">A handle to a window that the provider of network resources can use as an owner window for dialog boxes.</param>
      /// <param name="uncPath">The unc path to be connected.</param>
      /// <param name="driveLetter">The drive letter to map.</param>
      /// <returns>The connection result.</returns>
      public static void Connect(IntPtr hwndOwner, string uncPath, string driveLetter)
      {
         NETRESOURCEA netr = new NETRESOURCEA();
         netr.dwType = RESOURCETYPE_DISK;
         netr.lpLocalName = driveLetter;
         netr.lpRemoteName = uncPath;
         netr.lpProvider = null;

         NetworkErrorCode ret = WNetAddConnection3(hwndOwner, ref netr, null, null, CONNECT_INTERACTIVE);

         if (ret != NetworkErrorCode.NERR_Success)
            throw new Win32Exception((int)ret);
      }

      /// <summary>
      /// Connect to a network drive
      /// </summary>
      /// <param name="uncPath">The UNC path (e.g. "\\Server1\Share1")</param>
      /// <param name="driveLetter">The drive letter to map</param>
      /// <param name="userName">The username to connect the device</param>
      /// <param name="password">The password</param>
      /// <returns>True if mapped</returns>
      /// <example>Connect(@"\\Server1\Share1", "Z:", "myuser", "mypwd")</example>
      public static bool Connect(string uncPath, string driveLetter, string userName, string password)
      {
         NETRESOURCEA[] netResource = new NETRESOURCEA[1];
         netResource[0].lpRemoteName = uncPath;
         netResource[0].lpLocalName = driveLetter;
         netResource[0].dwType = RESOURCETYPE_DISK;
         netResource[0].lpProvider = null;

         NetworkErrorCode ret = WNetAddConnection2A(netResource, password, userName, 1);

         if (ret != NetworkErrorCode.NERR_Success)
         {
            throw new Win32Exception((int)ret);
         }

         return true;
      }

      #endregion

      #region Disconnect
      /// <summary>
      /// Method to disconnect an existing network drive
      /// </summary>
      /// <param name="sDrive">The device name (e.g. Z:)</param>
      /// <returns>True if disconnected</returns>
      /// <example>Disconnect("Z:")</example>
      public static bool Disconnect(string sDrive)
      {
         NetworkErrorCode ret = WNetCancelConnection(sDrive, true);

         if (ret != NetworkErrorCode.NERR_Success)
         {
            throw new Win32Exception((int)ret);
         }

         return true;
      }
      #endregion
   }

Grüße
Flo

03.01.2010 - 01:07 Uhr

Hallo pego

Bitte mal folgendes Statement auf der entsprechenden Datenbank ausführen:

SELECT 
      SERVERPROPERTY('ProductVersion') ServerVersion
      ,compatibility_level DbCompatibilityLevel
   FROM sys.databases 
   WHERE database_id = DB_ID()

Als "ServerVersion" muss "10.xxx" zurückgeliefert werden, sonst ist dein Server kein SQL Server 2008.
Als "DbCompatibilityLevel" muss "100" zurückgeliefert werden, sonst ist deine Datenbank nicht im 2008 Modus. In diesem Fall über die Eigenschaften der Datenbank den Kompatibilitätsmodus anpassen.

Grüße
Flo

01.01.2010 - 19:02 Uhr

Wie schon gesagt, bei den paar Datensätzen ist jede Storage-Engine (egal ob XML oder Datenbank) als Abfrage-Medium nichts als Overhead. Speicher die Daten in einem beliebigen Format und lade die Daten - z.B. beim Programmstart- in eine DataTable oder Listen und Dictionaries.

Bei deinen Eckdaten ist es wirklich egal welchen Weg du gehst.

01.01.2010 - 16:59 Uhr

Hallo chea77er

250-500 Daten?? Wenn's sich dabei nicht um irgendwelche Bilder oder sonstige große Binärdaten handelt, lad die ganzen Daten einfach in den RAM. Da ist's wurscht ob XML, SQL, CSV oder sonstwas. 500 Datensätze sind so wenig dass der Storage-Typ wirklich egal ist.

Grüße
Flo

31.12.2009 - 15:33 Uhr

Hi %

ResultSets gibt es unter ADO.NET nicht mehr 😉

Jain. Im Sinne von statischen ResultSets, wie in ADODB, 100% korrekt. Übrigens hießen ResultSets in der Microsoft-Landschaft immer Recordsets; ResultSets nennt man die nur in Java-Land. Im Sinne von - eigentlich viel wichtigeren - Forward-Only (AKA Firehouse-Cursor) Recordsets gibt's die eigentlich schon noch, heißen nur anders 😉. Der DataReader implementiert das Interface IDataRecord welches das klassische Recordset darstellt.

@Dolce:
DataSets/DataTable würde ich nur verwenden, wenn man mit diesen Objekten auch später weiterarbeitet, also keine eigenen Business-Objekte verwendet. Ansonsten stellen beide Objekttypen einen viel zu großen Overhead dar den man sich sparen kann.

Wie du das nun in deiner Applikation am sinnvollsten verwest kommt drauf an. Du schreibst:

Der Punkt weshalb ich mit Storedproc arbeite ist, das ich bei erweiterungen oder Fehlerbehebungen nur die Proc anpassen muss und nicht das ganze Project nochmals builden und publishen muss.

Wenn du mit "Erweiterungen" meinst, dass du ggf. neue Spalten zurücklieferst wirst du irgendeine flexible Struktur benötigen welche sich dynamisch an die zurückgelieferten Daten anpasst. In diesem Fall bist du mit der DataTable wahrscheinlich am besten bedient.

Wenn du eher den Fokus auf "Fehlerbehandlung" hast oder sich ggf. die Anzahl der Zeilen aufgrund von neuen Business-Cases ändert, kannst du eine beliebige - nicht dynamische - Struktur verwenden. Hier würde ich den IDataRecord und ein klassisches Mapping verwenden.

Grüße
Flo

28.12.2009 - 10:48 Uhr

Hallo Masterblume

Die nennen sich "Guidelines". Kann man im VS auch aktivieren - nur leider nicht über die Oberfläche sonder nur direkt über die Registry.

Hier ein Artikel dazu:
http://blogs.msdn.com/saraford/archive/2004/11/15/257953.aspx

Grüße
Flo

26.12.2009 - 14:59 Uhr

Hosted SVN ist da wesentlich günstiger.

... oder sogar Kostenlos:
http://www.xp-dev.com/

24.12.2009 - 11:14 Uhr

Hallo xpHelper

... jetzt würde mich interessieren wie ich ganz einfach einen bestimmten Wert auslesen kann.

Da liegt das Problem.

Es ist der falsche Ansatz zu versuchen nur irgendwie irgendeinen Wert aus einer Datenbank zu bekommen. Datenbanken sind ein großes, eigenständiges Thema in der Softwareentwicklung. Du kannst keine Web-Applikation bauen ohne zu wissen was HTML ist und wie's geht und du kannst keine Datenbank verwenden ohne zu wissen was SQL ist und wie's funktioniert. Datenbanken bringen - wie jedes andere Thema auch - eine Vielzahl an Patterns, Regeln und Gesätzmäßgkeiten mit.

Du solltest dir mindestens mal ein Tutorial anschauen welches zeigt wie ADO.NET funktioniert. Die ersten Datenbanken werden sicher innerhalb von Wochen (Tagen!?!) für die Tonne sein, aber dadurch lernt man. Man kommt nur an diesem lernen nicht vorbei.

Grüße
Flo

24.12.2009 - 11:07 Uhr

Ich wünsche auch allen frohe Weihnachten!

Ho ho ho
Da Weihnachts-Flo

24.12.2009 - 10:55 Uhr

Guten Morgen

Up- und Downloaded? Ich hatte dich wohl falsch verstanden. Ich dachte es geht um eine Web-Applikation. Hol dir doch einfach einen kostenlosen PHP-Web-Space und bau dir einen simplen Web-Service (auf ein XML File oder eine MySQL Datenbank) welchen du dann von deiner Anwendung aus aufrufen kannst.

Grüße
Flo

23.12.2009 - 16:34 Uhr

Coole Idee! Dann komme ich auf fast 1.000 assemblies! Ich weiß nur nicht ob das Studio dann Probleme bekommt wenn man die ganzen Referenzen hinzufügt. 😄

23.12.2009 - 15:13 Uhr

...dass Variante 2 generell übersichtlicher ist ...

Veto. Finde ich gar nicht.

23.12.2009 - 13:55 Uhr

Schau dir bitte einfach mal die Doku :rtfm: dazu an. Da findest du ein vollständiges Beispiel.

Grüße
Flo

23.12.2009 - 13:48 Uhr

Hallo Regenwurm

Erstmal zu deiner Frage:
Es gibt hier irgendwo einen Thread in dem unterschiedliche ASP.NET Provider aufgeführt werden. Ein paar von denen bieten auch SQL Server mit an.

Außerdem kannst du dir mal SQL Azure anschauen. Das ist ein Projekt von MS welches SQL Server im Web bereitstellt. Habe ich selbst noch nicht verwendet, soll aber ganz gut sein.

Zusätzlich:
Schließe mich Jelly an. Einen SQL Server im Web verwenden nur um 180 Datensätze (alles zusammen) zu speichern ist mit Kanonen auf Spatzen schießen. Das würde (wahrscheinlich) nicht mal ich machen 😄. Nimm XML oder CSV.

Grüße
Flo

23.12.2009 - 13:42 Uhr

Da du erstmal nicht dazugesagt hast ob's sich dabei um eine IP handeln könnte und als Trennzeichen ein Komma verwendest gehe ich einfach mal nicht davon aus 8)

         double dbl = double.Parse("192,168,1,144".Replace(",", ""));

Ansonsten schau dir mal BitConverter.ToDouble an.

Grüße
Flo

23.12.2009 - 13:38 Uhr

Hi

Noch ein klares Votum für Variante 1. Das allgemeine Konzept ist die Trennung von Schichten, nicht die Trennung von Domain Objekten. Wenn ein Domain-Model extrem viele Objekte komplett unterschiedlicher Zuständigkeiten beinhaltet würde ich (wenn überhaupt) eher da nochmal unterteilen:

Model.Sales;
--> OrderHeader
--> OrderDetail
--> ...
Model.Production;
--> Product
--> ProductCatalog
--> ...
Model.HumanResources;
--> Department
--> Employee
--> ...

Grüße
Flo

23.12.2009 - 11:31 Uhr

genau das geht eben nicht, da die Eigenschaft schreibgeschützt ist.

Öhm...

         XDocument xd = 
            XDocument.Parse(@"<Abteilung>
                             <Abteilung> Vertrieb </Abteilung>
                             <Abteilung> Marketing </Abteilung>
                           </Abteilung>");

         XElement xe = xd.Root;
         xe.Name = "Abteilungen";

Grüße
Flo

23.12.2009 - 11:20 Uhr

Hallo PMNS

Über XDocument.Root bekommst du das Root-Element. Auf dem kannst du den Namen ändern.

Grüße
Flo

22.12.2009 - 18:31 Uhr

Habe OleDB genommen, weil ich nicht weiß, was für DBs da irgendwann hintergrund sitzen. Spielt das denn im Bezug auf die SP eine Rolle?

So ziemlich jedes RDBMS bietet einen eigenständigen DB-Provider an der in ca. 100% aller Fälle besser ist als OLEDB 😉.
Du kannst ja mit den System.Data.Common Komponenten über eine Provider-Factory arbeiten. Dann bleibst du unabhängig - wobei du mit SPs (und auch ohne) - eh einiges anpassen werden musst.

So, aheb mal von OleDB auf SqlClient umgestellt . . .. selbes Phänomen 😦

Mal debugged? Breakpoint in "Ausführen" und schauen ob du da landest? Connection-String geprüft (richtige Datenbank?)?

Grüße
Flo

22.12.2009 - 15:01 Uhr

Du mussts nicht "Precision" sondern "Size" setzen. (Bitte dazu mal die MSDN bemühen.)

Außerdem solltest du unbedingt von OLEDB auf SqlClient wechseln. Weil schneller und in jeder Hinsicht besser.

Was zeigt denn der Profiler dazu an?

Grüße
Flo

22.12.2009 - 14:54 Uhr

Hallo Scoutman

Bist du sicher dass du die richtige Datei lädst? Versuche doch mal ein:
Console.WriteLine(File.ReadAllText(@"C:\temp\tabellen.xml"));
... und prüfe ob auch wirklich was in der Datei steht. Vielleicht erzeugst du die Datei vorher und sie ist noch nicht ge-flushed.

Grüße
Flo

22.12.2009 - 13:00 Uhr

Hallo Scoutman

Das ist eigentlich wirklich nicht schwer. Was hast du denn schon versucht?

Grüße
Flo

22.12.2009 - 12:29 Uhr

Hallo Sythus

Solution Explorer -> Rechte Maustaste auf die Datenbank -> Eigenschaften -> Kopieren auf "Niemals" stellen.

Grüße
Flo

22.12.2009 - 12:16 Uhr

*LOL*
Hat jetzt auch ein bisschen gedauert bis ich draufgekommen bin... Deine Abfrage stimmt und deine Werte stimmen, aber alle Text-Parameter sind initialisiert mit einer Länge von 1 (z.B. "DECLARE @standort varchar**(1)**"). Passe die Stelle im Source-Code an, an der du die SqlCommand-Objekte erzeugst und die Parameter anhängst.

Grüße
Flo

22.12.2009 - 11:42 Uhr

Na weil halt deine WHERE Klausel nicht passt. 😉

Prüfe deine Daten und die Parameter welche du übergibst, dann findest du den Fehler.

Grüße
Flo

22.12.2009 - 11:36 Uhr

Hallo DjBepy

Führ' mal bitte das aus:

DECLARE @RC int
DECLARE @ik int
DECLARE @standort varchar(1)
DECLARE @entgeltbereich varchar(1)
DECLARE @fallnummer varchar(1)
SELECT @ik = 260100012
SELECT @standort = '00'
SELECT @entgeltbereich = 'DRG'
SELECT @fallnummer = 'Fall_10001'
--EXEC @RC = [VerwaltungsDB2009].[dbo].[delete_Ein_LeistungsFall] @ik, @standort, @entgeltbereich, @fallnummer
--DECLARE @PrnLine nvarchar(4000)
--PRINT 'Gespeicherte Prozedur: VerwaltungsDB2009.dbo.delete_Ein_LeistungsFall'
--SELECT @PrnLine = '    Rückgabecode = ' + CONVERT(nvarchar, @RC)
--PRINT @PrnLine

--UPDATE [VerwaltungsDB2009].[dbo].[Fall_Geliefert]
--SET  [fg_storno]     = 'J'
SELECT * FROM [VerwaltungsDB2009].[dbo].[Fall_Geliefert]
WHERE
    ( [fg_ik]     = @ik AND
     [fg_standort]     = @standort AND
     [fg_entgeltbereich]     = @entgeltbereich AND
     [fg_fallnummer]     = @fallnummer)

Bekommst du hier ein Ergebnis?

Grüße
Flo

22.12.2009 - 10:05 Uhr

Hallo snupi

Hast recht. "Id" kannst du dir eigentlich im Index sparen. Es bringt durchaus (wenn sich Compact halbwegs wie der große Bruder verhält) ein bisschen was, da die Engine nicht von der Index-Page zur Daten-Page (oder zum PK in deinem Fall) springen muss um die "Id" für die Sortierung auszulesen. Dafür die Spalte aber komplett in den Index zu packen ist schon recht teuer. Bei SQL Server (nicht Compact) könnte man hier für einen deutlich niedrigeren Preis die gleiche Optimierung erreichen indem man die Spalte über INCLUDE in den Index einfügt.

Grüße
Flo

21.12.2009 - 20:51 Uhr

Hallo snupi

  1. ab wievielen einträgen kann es mit der abfrage zu performanceproblemen kommen ?

Kann man pauschal nicht sagen. Kommt auf die Menge der Datensätze, die Menge der Abfragen, die Speicherverwaltung und -verfügbarkeit, usw. an.

  1. wie könnte ich am besten einen index setzen ? (datetime ist nicht unique und IGNORE_DUP_KEY gibt es ja meines wissens beim compact sql server nicht)

Ich glaube bei IGNORE_DUP_KEY hast du was falsch verstanden:

IGNORE_DUP_KEY = { ON | OFF }
Specifies the error response to duplicate key values in a multiple-row insert operation on a unique clustered or unique nonclustered index. The default is OFF.

ON
A warning message is issued and only the rows violating the unique index fail.

OFF
An error message is issued and the entire INSERT transaction is rolled back.

The IGNORE_DUP_KEY setting applies only to insert operations that occur after the index is created or rebuilt. The setting has no effect during the index creation operation.

IGNORE_DUP_KEY cannot be set to ON indexes created on a view.

In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

Man kann auch einen normalen Index auf der Tabelle definieren:

CREATE INDEX IX_TestIndex_DateTime
   ON TestIndex (DateTime);

Da muss nichts UNIQUE sein.

Wenn durch den Datumsbereich oft viele Werte zurücklieferst würde ich ggf. die Id noch mit in den Index packen um den Overhead der Sortierung zu vermeiden:

CREATE UNIQUE INDEX IX_TestIndex_DateTime_Id 
   ON TestIndex (DateTime, Id);

... dann ist's auch wieder UNIQUE.

Außerdem würde ich Namen wie "DateTime" bei Spalten möglichst vermeiden, da es sich hierbei um SQL Server Keywords handelt.

Grüße
Flo

21.12.2009 - 16:56 Uhr

Hallo JasonDelife

@Flo:
Du meinst sicher....

Oups... Kommt davon, wenn man nicht im Studio, sondern in einer Text-Box im Browser "programmiert"...
Sorry, und danke für die Verbesserung.

Grüße
Flo

21.12.2009 - 16:44 Uhr

Hallo XXL

Wenn SQL Server mit im Spiel ist kannst du auch die DB2 über Linked Server am SQL Server registrieren und direkt über SQL die Daten miteinander ver-joinen.

Grüße
Flo

21.12.2009 - 16:42 Uhr

Hallo Shanick

Abhängig von dem was du alles unterstützen willst kannst du es so machen:


if (!double.TryParse(sEingabe)) {
   // show error
   return;
}

// ...

Grüße
Flo