Laden...
Avatar #avatar-2373.jpg
thore.fiedermann myCSharp.de - Member
Software-Entwickler Deutschland Dabei seit 16.08.2007 30 Beiträge
Benutzerbeschreibung

Forenbeiträge von thore.fiedermann Ingesamt 30 Beiträge

15.08.2019 - 12:49 Uhr

Das führt leider auch nicht zum Erfolg. Die Fehlermeldung lautet "Das Objekt konnte nicht gelöscht werden, da eine FOREIGN KEY-Einschränkung auf das Objekt verweist.". Ich habe 14 abhängige Objekte und dasmacht das Ganze sehr schwierig... Ich probiere in der Richtung noch einmal ein bisschen rum.

15.08.2019 - 10:37 Uhr

Das weiß ich. Nichts desto trotz möchte das Management Studio die Tabelle droppen und neu anlegen.

15.08.2019 - 09:39 Uhr

verwendetes Datenbanksystem: MS SQL Express 2014

Moin

Folgendes Problem: Ich habe eine Tabelle mit Primärschlüssel. Dieser wird von mir bis jetzt manuell vergeben (über MAX(Primärschlüssel + 1) ). Das Problem ist, dass ich einen bereits einmal vergebenen Primärschlüssel nicht mehr vergeben möchte. Dazu bietet sich die Identity-Eigenschaft mit Auto_Increment eigentlich an. Ich kann allerdings die Daten aus dieser Tabelle nicht löschen, da ich etliche Tabellen mit dem Primärschlüssel als Fremdschlüssel und dem CASCADE Delete anhängig habe.

Gibt es eine Möglichkeit diese Eigenschaft doch ohne DROP Table hinzuzufügen? Oder irgendwie zu simulieren? Ich hole mir den Schlüssel in einer eigenen StoredProcedure und habe alle Möglichkeiten, dort auf den nächsten freien (noch nie vergebenen Schlüssel) zuzugreifen.

Ich hoffe, ich konnt mich verständlich ausdrücken.

MfG
Thore

08.04.2019 - 08:59 Uhr

Guten Morgen

Kurze Beschreibung vorweg:
Ich habe zwei Prozesse, die Informationen über eine Dateischnittstelle austauschen.
Prozess1: Der schreibt die Datei. Diesen Prozess kann/darf ich nicht verändern. Der ist so, wie er ist.
Prozess2: Mein C#-Prozess. Der lauscht auf den Ordner und wird benachrichtigt, wenn die Datei erzeugt wird. Dann nimmt er diese Datei und benennt sie um (damit neue Daten gesendet werden können), liest sie aus und löscht sie danach.
Es handelt sich immer nur um eine Datei von wenigen kB an Daten. Nichts desto trotz, ist es möglich, dass die Datei noch gesperrt ist, wenn Prozess2 darauf zugreifen will. Dafür habe ich einfach eine Schleife eingebaut, die die Datei 5 mal in einem Abstand von 0,5 Sekunden umbenennen möchte. Das langt eigentlich immer.

**Das Problem: **
Ich habe eine System, wo dieser Zugriff immer wieder misslingt. Ich weiß aber nicht welcher Prozess, diese Datei sperrt. Prozess1 ist eigentlich unverdächtig. Normalerweise funktioniert die Kommunikation so. Ein Virenscanner wurde bereits deaktiviert und kann damit ausgeschlossen werden.
Über den Recourcenmonitor von Windows bin ich zu langsam.
Gibt es eine Möglichkeit über C# herauzufinden, welcher Prozess eine Datei sperrt? Oder über die Konsole (Eine Batchdatei könnte ich anstoßen).

Ich hoffe ich konnte mein Problem genau genug beschreiben, sonst fragt gerne nach.

Gruß Thore

PS: Im Forum und im Internet bin ich nicht fündig geworden "Datei gesperrt", "Dateizugriff", "Wer greift auf meine Datei zu?", "c# zur laufzeit herausfinden, welcher prozess eine datei gesperrt hat", "c# datei gesperrt herausfinden von wem", "Dateizugriff verweigert"

28.04.2015 - 13:32 Uhr

Moin zusammen!

Ich habe eine Benutzerverwaltung, die auf einem lokalen Windows 7 Embedded basiert. Benutzeranfragen stelle ich wie folgt:

PrincipalContext.ValidateCredentials(pUsername , pPassword , ContextOptions.Negotiate);

Darunter habe ich einen Catch-Block, der evtl Fehler abfängt und auflöst. Das Ganze funktioniert soweit auch super. Benutzer werden erfolgreich angemeldet, falsches Passwort oder Benutzername werden gemeldet, usw.

Ein Problem habe ich, wenn die lokalen Sicherheitseinstellungen das Passwort ablaufen lassen. Dann bekomme ich anstatt einen PASSWORD_EXPIRED-Fehler einen EXTENDED_ERROR. Und ich weiß nicht warum.

Test habe ich wie folgt gemacht:

  • Ich habe die local security policy auf Ablauf des Passwortes nach 30 Tagen gestellt.
  • Habe einen neuen Benutzer angelegt
  • Dann habe ich das Systemdatum einfach 1,5 Monate vorgestellt.

Vor dem Verstellen des Datums funktionierte die Anmeldung einwandfrei. Danach nicht mehr. Das ist soweit ja ok. Allerdings ist es eine falsche Exception.

Ich hoffe ich konnte mich verständlich ausdrücken. Ich stecke nicht wirklich tief im Thema Benutzerverwaltung unter Windows und dessen Rückmeldung.

Danke im Vorraus für die Hilfe
Gruß Thore

10.05.2012 - 14:45 Uhr

man sollte bei dieser Technik aber darauf achten, daß das Bitmap zum Schluß immer nur verkleinert wird, und nicht vergrößert. Sonst wird es ziemlich schnell ziemlich pixelig...

Das meinte ich mit meinem letzten Satz: "Jetzt muss man sich nur noch Gedanken machen, wie stark das ganze verzerrt werden kann.". Das Ganze hat natürlich seine Grenzen. Aber das ist ja hier nicht Thema.

du solltest auch die Ressourcen (wie Font, Brush, etc.) wieder freigeben, per Dispose und am besten durch die Verwendung von using. Siehe auch

Natürlich gebe ich die Recourcen wieder frei. Das ist ja auch nur ein Ausschnitt aus meinem Code gewesen (Woher sollte ich sonst z. B. "e.Graphics" haben. Das kommt aus meiner OnPaint-Routine)

Trotzdem vielen Dank für die Hinweise 😃

10.05.2012 - 14:02 Uhr

Einfach aber effektiv. Manchmal sieht man den Wald vor lauter Bäumen nicht. Meine Lösung sieht im Moment so aus:


string drawString = "Diagnosen"; // Der String, der gezeichnet werden soll
Font drawFont = new System.Drawing.Font("Arial Black", 16); // Schriftart
SolidBrush drawBrush = new System.Drawing.SolidBrush(Color.White); // Schriftfarbe

SizeF size = e.Graphics.MeasureString(drawString, drawFont); // Größe des Strings berechnen

Bitmap lBitmap = new Bitmap((int)size.Width, (int)size.Height); // Bitmap in der berechneten Größe anlegen
Graphics graph = Graphics.FromImage(lBitmap); // Graphicobjekt erzeugen
graph.DrawString(drawString, drawFont, drawBrush, 0, 0); // String zeichnen

e.Graphics.DrawImage(lBitmap, 50, 100, 375, 50); // Das so entstandene Bitmap auf die Form zeichnen

Falls jemand noch eine bessere Methode kennt, gerne her damit. Aber so ist das schon erfüllt. Jetzt muss man sich nur noch Gedanken machen, wie stark das ganze verzerrt werden kann.

10.05.2012 - 13:28 Uhr

Hallo alle zusammen!
Ich bin nach langer Sucher leider nicht fündig geworden.

Ich habe eine Windows-Form auf der ich einen festgelegten Bereich als Überschrift benutzen möchte. Egal wie viele Buchstaben der String enthält soll er immer 375 Pixel breit sein. Beispiel im Anhang.

Hoffe die kurze Beschreibung reicht.
Gruß Thore

20.04.2011 - 08:38 Uhr

Guten Morgen alle zusammen!

Ich habe mir Aufgrund von Performanceproblemen bzw. Seitenaufbauzeiten ein eigenes Label "gebaut".

Kern des Ganzen ist das Zeichnen des Labels mit eigenen Methoden (eigener Rahmen, Farben, ect.).

Hier meine eigene Klasse (bzw Ausschnitte):


using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace HMI
{
  public class ABorderLabel : IDisposable
  {
    // Hier folgen viele Getter- und Setter-Methoden. Die beiden Ersten nur mal als Beispiel

    private Control mParent;
    public Control Parent
    {
      get { return mParent; }
      set { mParent = value; }
    }

    private Point mLocation = new Point(0, 0);
    public Point Location
    {
      get { return mLocation; }
      set
      {
        mLocation = value;
        mLeft = mLocation.X;
        mTop = mLocation.Y;
        if (null != mParent) mParent.Invalidate(new Rectangle(mLocation.X, mLocation.Y, mWidth, mHeight));
      }
    }


    public ABorderLabel() { } // leerer Konstruktor

    // Das eigentliche Zeichnen
    public void Draw(System.Drawing.Graphics G)
    {
      if (mVisible)
      {
        GraphicsPath lGP = AGraphicsFunc.GetRoundedRectanglePath(mLocation.X, mLocation.Y, this.Width, this.Height, mBorderRadius);
        
        G.DrawPath(new Pen(mBorderColor), lGP);
        G.FillPath(new SolidBrush(mBackColor), lGP);

        StringFormat lStrFormat = BuildStringFormat(StringTrimming.Character, mTextAlign);
        G.DrawString(mText, mFont, new SolidBrush(mForeColor), new Rectangle(mLocation.X, mLocation.Y, mWidth, mHeight), lStrFormat);
      }
    }
  
  }
}

In meiner Form initialisier ich das Ganze dann ganz normal wie mit jedem anderen Objekt:


blbSrel1.Location = AGraphicsFunc.ResizedLocation(402, 548);
blbSrel1.Size = AGraphicsFunc.ResizedSize(60, 20);
blbSrel1.Parent = this;
blbSrel1.TextAlign = ContentAlignment.MiddleCenter;
blbSrel1.Font = AGlobVar.Font10n;
blbSrel1.BackColor = Color.FromArgb(100, 255, 255, 255);
blbSrel1.BorderColor = Color.FromArgb(143, 156, 158);
blbSrel1.BorderRadius = 5;
blbSrel1.ForeColor = Color.Black;
blbSrel1.Click += new EventHandler(blbSrel1_Click);

Die letzte Zeile macht mir nun die Probleme. Wie implementiere ich ein Click-Ereignis auf die Fläche des Labels. Ich habe zwischenzeitlich auch meine Klasse von der Klasse Label des Frameworks abgeleitet (momentan wieder IDisposable). Dann steht mir das Click-Ereignis auch zur Verfügung, wird aber nicht ausgelöst. Ich habe mir die Themen für die Implementierung von EventHandlern durchgelesen und einiges ausprobiert. Komme an der Stelle nicht weiter.

Hoffe, ich habe mein Problem gut beschrieben und nicht zu viel Code reingestellt. Für Hilfen wäre ich sehr dankbar.

Gruß aus dem Norden Thore

09.03.2010 - 12:38 Uhr

@dN!3L: Mir ist schon klar, dass ich ohne Sortierung irgendwas bekomme. Ich habe wie gesagt auch einen fortlaufenden Schlüssel, aber er ist im Laufenden betrieb nicht ohne Lücken.

@FZelle: Paging sagt mir jetzt als Funktion von SqlServer nichts... Meinst Du die Methode über Row_Number und OVER?! Die benutze ich ja jetzt auch (Erste Antwort von dN!3L)...

09.03.2010 - 11:41 Uhr

@JAck30lena: Meine Tabelle enthält zwar einen fortlaufenden Schlüssel. Allerdings können Daten zwischendurch gelöscht werden. Damit entstehen automatisch Lücken. Und ja: ich will bei einer großen Tabelle immer nur die Daten der aktuell angezeigten Seite in ein DataGridView laden (aufwendige Bearbeitung der Daten: Multi-Lingual, Bilder, abhängige Daten aus anderen Tabellen).

@unclesam: Nein, es gibt kein LIMIT bei MSSQL. Leider hat sich Microsoft da mal an die Konventionen gehalten.

@dN!3L: Danke. Der Artikel beschreibt genau, was ich erreichen will. Jetzt muss sich nur noch heraus stellen, ob dieses Vorgehen auch bei einer gefüllten Tabelle noch die nötige Performance zeigt 😉

09.03.2010 - 11:05 Uhr

verwendetes Datenbanksystem: MS SQL Server 2008

Hallo!
Wie rufe ich mir aus einer Tabelle mit z.B. 100 Einträgen die 50. Zeile ab? Die Tabelle hat keine fortlaufende Id, weil zwischendurch immer wieder Daten gelöscht werden können oder Daten gefiltert werden.
Genauer gesagt brauche ich sogar eine gewisse Anzahl von Zeilen, ab einem bestimmten Eintrag in der Tabelle: 16 Einträge ab dem 50. Eintrag in der Tabelle. Mit der X. Zeile würde ich da aber auch alleine Weiter kommen.
Die Tabelle kann sehr groß werden. Aus Performancegründen wollte ich daher keine temporäre Tabelle mit einem künstlichen fortlaufenden Schlüssel benutzen...

Hoffe ich hab das Problem gut genug beschrieben. Danke für die Hilfe!

24.06.2009 - 11:22 Uhr

@Jürgen: Super! Du hast meinen Eintrag in einem anderen Formu gefunden! Aber nicht jeder ist in ALLEN Foren vertreten! Deshalb versuch ich mein Problem an möglcihst viele Nutzer heranzutragen! Aber suche fleissig weiter! Drei weitere gleiche Einträge in anderen Foren hast Du noch nicht gefunden! 😉 kleiner Scherz am Rande muss erlaubt sein

@ErfinderDesRades: Leider kann ich Dein Problem mit dem Download nicht nachvollziehen. Ich hab mir das Projekt gerade einmal selbst heruntergeladen und die Bilder sind da 🙁

Tut mir leid mit den Try..Catch-Blöcken! Ich habe das Projekt sehr stark gekürzt damit es übersichtlich wird und deshalb die Blöcke nur leer gemacht anstatt sie zu löschen. in meinem Original hab ich natürlich ein Error-Handling. Ich werd das nochmal korrigieren, damit es für alle besser wird! 👍

24.06.2009 - 08:19 Uhr

Ich habe eine Windows Form, die ich bei Erzeugung mit recht vielen Pictureboxen bestücke. Diese Pictureboxen laden einige Bilder im *.PNG-Format. Dies benutze ich wegen der Transparenten Anteile un der Dateigröße wegen. Allerdings habe ich das gleiche Problem bei Bildern im BMP, GIF und JPG - Format.
(Projekt: HMI, ACHTUNG: Damit das Projekt funktioniert müsst ihr nach erstmaligen Erstellen des Projektes den Ordner "_1600" mit den Bildern in das "bin/Debug" bzw. "bin/release"-Verzeichnis kopieren)

Problem dabei ist, dass die Elemente auf der Form beim Anzeigen ganz unschön aufpoppen. Erstens dauert der Aufbau schon recht lange und zweitens sind diese leeren weißen Vierecke der Pictureboxen auch häßlich.

Ich habe im Netz schon nach den verschiedensten Möglichkeiten gesucht das ganze zu beschleunigen: DoubleBuffered, SuspendLayout, Ich habe das Fenster erst unsichtbar gemacht und wollte es nach der Objekterzeugung anzeigen, Ich habe das Fenster weit außerhalb des sichtbaren Bereiches erzeugt und dann verschoben, etc. Ich habe mir auch alle Forumbeiträge was das Zeichnen auf eine Form und in Pictureboxen angeht angeguckt und keine Lösung gefunden. Die Geschwindigkeit ändert sich auch mit dem Release Build ohne Debugger nicht!

Das gleiche Problem stellt sich bei meinem Testprojekt (Projekt: TestLabels). Ich plaziere darauf 5000 Labels (ist auch bei kleineren Zahlen schon sichtbar) und zeige diese nur an und die Aufbauzeiten des Formulars sind der Horror.

Ich habe zum Testen meine beiden Projekte mit angehängt. Es wäre schön, wenn ihr Euch bei der Lösung des Problems konkret auf diese beziehen könntet damit ich das besser nachvollziehen kann!

Ich bin zwar Programmierer, aber ich habe mir C# selber beigebracht. Vielleicht gibt es ja irgendwo einen Schalter, den ich nur umlegen muss, damit das alles schneller läuft. Schön wäre ein einzeiliger Befehl wie "Project.MachDasAllesSchneller(this);" 😉 Vielen Dank für Eure Mühe!

Hier der Quelltext für meine kleines Testprojekt mit den Labels. Dann braucht ihr Euch das Projekt nicht runterladen. Wichtiger ist mir aber das Projekt "HMI" mit den Pictureboxen. Nur ist hier der Quellcode zu lang:


using System;
using System.Drawing;
using System.Windows.Forms;

namespace testApp
{
  public partial class Form1 : Form
  {
  
    Label[] lblTest = new Label[5000];

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender , EventArgs e)
    {
      this.Top = 0;
      this.Left = 0;
      this.Width = 1600;
      this.Height = 1200;
    }

    private void button1_Click(object sender , EventArgs e)
    {
      this.Hide(); // Fenster verstecken 
      Random x = new Random();
      for (int i = 0; i < lblTest.GetLength(0); i++)
      {
        lblTest[i] = new Label()
        {
          Visible = true
        , Top = x.Next(1190)
        , Left = x.Next(1500)
        , Height = 15
        , Width = 100
        , Text = x.Next(1000000000).ToString()
        , BackColor = Color.Aquamarine
        , Parent = this
        };
      }
      this.Show(); // Fenster wieder anzeigen
    }
  }
}

06.08.2008 - 10:31 Uhr

PERFEKT! Jetzt funktioniert es. Hat also mit der Reihenfolge der Befehle zu tun. Falls jemand weiß warum, kann er das ja gerne posten. Hier für alle Interessierten meine fertige Funktion mit dem Winkel als Übergabeparameter.

Vielen Dank Lothi und natürlich alle Anderen, die sich damit beschäftigt haben!


private void RotateArrow2(int pAngel)
    {
      Bitmap lBitmap = new Bitmap(154, 154, PixelFormat.Format32bppArgb);
      Graphics lGraphics = Graphics.FromImage(lBitmap);

      Pen lPen = new Pen(Color.Black, 1);
      Brush lBrush = new SolidBrush(Color.Red);

      // Pfeil zeichnen
      GraphicsPath gp = new GraphicsPath();
      gp.AddLine(72, 82, 82, 82);
      gp.AddLine(82, 82, 82, 38);
      gp.AddLine(82, 38, 78, 34);
      gp.AddLine(78, 34, 78, 24);
      gp.AddLine(78, 24, 82, 20);
      gp.AddLine(82, 20, 77, 5);
      gp.AddLine(77, 5, 72, 20);
      gp.AddLine(72, 20, 76, 24);
      gp.AddLine(76, 24, 76, 34);
      gp.AddLine(76, 34, 72, 38);
      gp.AddLine(72, 38, 72, 82);
      gp.CloseFigure();

      // Pfeil rotieren
      m = new Matrix();
      m.RotateAt(pAngel, new PointF(77, 77));  // Um diesen Punkt soll der Pfeil rotieren
      lGraphics.Transform = m;

      lGraphics.FillPath(lBrush, gp); // Den Pfeil Ausfüllen
      lGraphics.DrawPath(lPen, gp); // Die Linie um den Pfeil zeichnen

      lGraphics.DrawEllipse(lPen, 77, 77, 1, 1); // Rotationspunkt einzeichnen

      picAccelerationArrow.Image = lBitmap; // Fertige Bild der PictureBox zuordnen
    }

06.08.2008 - 10:03 Uhr

Hat leider keine Veränderung gebracht. Der Pfeil dreht sich nicht.

06.08.2008 - 08:06 Uhr

Eine einfache Linie ist leider nicht ausreichend. Die Zeichnung von dem Pfeil ist von einem Designer festgelegt. Eine einfache Linie würde mir auch besser passen 😉

06.08.2008 - 07:44 Uhr

Hallo zusammen!
Ich hab folgendes Problem: Ich muss eine Pfeil für ein Tacho zeichnen und diesen entsprechend der Geschwindigkeit drehen.
Mein erster Versuch mit einem bereits vorhandenen Bild und das Drehen um einen bestimmten Punkt und der Funktion RotateAt schlug leider fehl. Das Bild rotierte um alle herum, nur nicht um den Punkt, den ich wollte. zusätzlich wurde der Pfeil nach dem Drehen auch oft nicht komplett in die PictureBox gezeichnet, sondern ragte über den Rand hinaus.
Meinen zweiten Versuch seht Ihr unten. Ich zeichne den Pfeil selber und habe versucht diesen um den Drehpunkt (bei 77,77) zu drehen. Dies Funktioniert leider nicht.
Zur Anmerkung an alle "Forumzurechtweiser" wie ich sie so schön nenne: JA, ich habe mir die MSDN zu RotateAt angeguckt. Ich habe mir auch alle Themen, die auch nur das Wort "drehen", "rotieren", etc. enthalten durchgelesen. Ich habe jetzt auch zwei Tage mit fummeln und Tests verbracht ==> Ich finde keine Lösung. Hab mich leider irgendwie festgefahren.

Eine Lösung, in der ich den Pfeil einfach mit einem übergebenen Winkel selbst gedreht zeichne, würde mir auch helfen.

Danke für Eure Aufmerksamkeit und Mühe.


{
      Bitmap lBitmap = new Bitmap(154, 154, PixelFormat.Format32bppArgb);
      Graphics lGraphics = Graphics.FromImage(lBitmap);

      Pen lPen = new Pen(Color.Black, 1);
      Brush lBrush = new SolidBrush(Color.Red);
      
      // Pfeil zeichnen
      GraphicsPath gp = new GraphicsPath();
      gp.AddLine(72, 82, 82, 82);
      gp.AddLine(82, 82, 82, 38);
      gp.AddLine(82, 38, 78, 34);
      gp.AddLine(78, 34, 78, 24);
      gp.AddLine(78, 24, 82, 20);
      gp.AddLine(82, 20, 77, 5);
      gp.AddLine(77,  5, 72, 20);
      gp.AddLine(72, 20, 76, 24);
      gp.AddLine(76, 24, 76, 34);
      gp.AddLine(76, 34, 72, 38);
      gp.AddLine(72, 38, 72, 82);
      gp.CloseFigure();
      lGraphics.FillPath(lBrush, gp);
      lGraphics.DrawPath(lPen, gp);

      lGraphics.DrawEllipse(lPen, 77, 77, 1, 1); // Punkt hinzufügen, um den der Pfeil kreisen soll

      Image lImage = lBitmap;
      m = new Matrix();
      m.RotateAt(45, new PointF(77, 77));  // Um diesen Punkt soll der Pfeil kreisen
      lGraphics.Transform = m;

      lGraphics.DrawImage(lImage, 0, 0);

      picAccelerationArrow.Image = lBitmap;
    }

12.12.2007 - 12:50 Uhr

Vielen Dank für die schnellen Antworten. Ich habs jetzt.

Für alle die meine Lösung interessiert:

Die Stored Procedure sieht folgendermassen aus:


BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT * FROM Control WHERE TransmittedToVme = 0

	Update Control Set TransmittedToVme = 1 WHERE TransmittedToVme = 0
END

Der Codeabschnitt in meinem C-Sharp-Programm sieht so aus:


string lCommandString;
string lConnectionString;
DataTable lDataTable;
SqlDataAdapter lDataAdapter;

lCommandString = "EXECUTE dbo.uspGetControl";
lConnectionString = "server=ng01\\dbng; database=Testdatenbank; User=sa; Password=GehtDichNichtsAn;";
lDataTable = new DataTable("Control");
lDataAdapter = new SqlDataAdapter(lCommandString, lConnectionString);

lDataAdapter.Fill(lDataTable);

Nach Ausführen des Programms habe ich dann in dem Table-Objekt die Zeilen, die ich anschließend in der StoredProcedure mit dem UPDATE-Statement verändere.
Das Einfügen einer Temp-Table ist hier nicht notwendig.

12.12.2007 - 08:46 Uhr

Danke ersteinmal für die Antwort!

Ich glaube ich hab mich doch nicht so Verständlich ausgedrückt. Das war noch nicht alles:
Wie komme ich jetzt in meinem C-Sharp-Code an das Resultset der Stored Procedure?
Ich komme da nicht wirklich weiter. Zuvor habe ich immer nur Ausgabeparameter für einzelne Werte an Stored Procedure übergeben.

Mit meiner normalen Vorgehensweise komme ich nicht an das Resultset:


        SqlConnection cn = new SqlConnection(ConnectionString);
        try
        {
          SqlCommand cmd = new SqlCommand("uspGetControl", cn);
          cn.Open();

          cmd.CommandType = CommandType.StoredProcedure;
          cmd.ExecuteNonQuery();

        }
        finally
        {
          cn.Close();
        }

Für ein Codebeispiel wäre ich dankbar!

12.12.2007 - 08:11 Uhr
  1. Ich KANN das SELECT-Statement nicht nach dem UPDATE-Statement schreiben, da ich dann nicht mehr das gleiche Ergebnis bekomme!

  2. Ich möchte gerade mit den gespeicherten Prozeduren die SQL-Logik aus dem C-Sharp Programm ziehen

  • Verbergen der Struktur der DB für den Kunden
  • Vereinfachung des Codes, da ich immer alles über Stored Procedures abrufe
  • Der SQL-Server überwacht die Stored Procedures. D. h. Abhängigkeiten bei Änderungen können leichter nachvollzogen werden.
  1. Man kann immer über Sinn und Unsinn von Stored Procedures diskutieren. Das war aber nicht die Frage. Wenn es geht WILL ich Stored Procedures einsetzen. Also zurück zu Beitrag 1. Also zurück zur Frage.
12.12.2007 - 07:28 Uhr

verwendetes Datenbanksystem: MS SQL Server Express 2007

Hallo!
Folgendes Problem. Ich möchte aus einer Stored Procedure als Rückgabe ein komplette Tabelle erhalten. Die Stored Procedure enthält nur ein SELECT und ein UPDATE-Statement. Die Kapselung hat verschieden Gründe.
Wenn ich die Stored Procedure aus dem Server Management Studio aufrufe erhalte ich auch genau die Tabelle, die ich haben möchte. Ich bin jetzt nur hilflos, was die Einbindung in C_Sharp angeht. Als Ergebnis hätte ich gerne die Tabelle aus der SELECT-Anweisung. Danke für die hilfe im Voraus

Hier die Stored Procedure:


BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

        -- Insert statements for procedure here
	SELECT * FROM Control WHERE TransmittedToVme = 0
	UPDATE Control SET TransmittedToVme = 1 WHERE TransmittedToVme = 0
END

Kurze Funktionsbeschreibung: Ich suche mir alle Zeilen heraus, wo die Spalte TransmittedToVme gleich 0 ist und setze danach die Spalte auf 1. Ich möchte als Rückgabewert die Zeilen haben, die ich mit dem Select-Statement aufgerufen habe.

11.09.2007 - 12:21 Uhr

Ja, danke. Hat alles geklappt.
Ich muss mich wohl noch ein wenig mit den Funktionalitäten von abgeleiteten Formularobjekten und eingebunden Libaries beschäftigen. Im Moment ist das Thema aber erledigt.
Was ein Glück, dass Ihr beiden so in schreiblaune gewesen seid 😉

MfG
Thore

11.09.2007 - 11:41 Uhr

Ok, soweit funktioniert das wieder. Ich glaube ich habe auch verstanden, warum das vorher nicht funktioniert hat.

Gibt es da noch eine andere (elegantere, sinvollere) Möglichkeit, wie ich meinen abgeleiteten Button besser einbinden kann? Eine DLL erstellen? Wie mach ich das? Ich muss den Button ja (hoffentlich) nie wieder verändern, wenn er einmal die Eigenschaften hat, die er haben soll.

Jetzt schon mal vielen Dank für die schnellen Antworten (vorher und hoffentlich auch noch mindestens eine nachher 😉 )

Thore

11.09.2007 - 11:04 Uhr

Ich habe für den Button gar keine dll erstellt. Ich habe ihn einfach mit einer Klasse über Hinzufügen/neues Element dem Projekt hinzugefügt.

Da ich nach dem einchecken mein funktionierendes Projekt nicht gelöscht habe (Holzauge sei wachsam 😉 ), habe ich ein wenig mit dem "obj"-Ordner und den darin enthaltenen Dateien herumgespielt. Wenn ich die Datei "[ProjektName]\obj\Debug[ProjektName].exe" nicht lösche, habe ich keine Probleme auf die Designoberfläche meiner Form zu wechseln.

Vielleicht ist mein Ansatz mit dem "abgeleiteten Button einbinden" auch falsch und funktioniert nur zufällig.

Mein Ansatz mit meinem Button war:

  1. Ich habe dem Projekt eine neue Klasse hinzugefügt.

  2. Hier habe ich den Konstruktor überschrieben:


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

namespace HMI
{
  public partial class AButton : System.Windows.Forms.Button
  {
    public AButton()
    {
      this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, false);
      this.BackColor = Color.Transparent;
      this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
      this.FlatAppearance.BorderSize = 0;
      this.FlatAppearance.MouseDownBackColor = Color.Transparent;
      this.FlatAppearance.MouseOverBackColor = Color.Transparent;
    }

    //protected override bool ShowFocusCues
    //{
    //  get { return false; }
    //}

  }
  
}

  1. Der Button erschien nun auf der Auswahlleiste der Toolbox.

  2. Diesen Button habe ich dann auf meine Form gezogen.

  3. Fertig. Funktioniert. Solange ich nicht den Obj-Ordner lösche und die darin enthaltene EXE-Datei.

11.09.2007 - 09:56 Uhr

Folgendes Problem:
Ich habe mir einen eigene Button-Klasse erstellt AButton. Diese ist von Button abgeleitet. Soweit kein Problem. Nachdem ich die Klasse erstellt habe erscheint in der Toolbox das neue Element "AButton", dass ich auch ohne Probleme auf die Form ziehen konnte.
Nachdem ich mein Projekt jetzt in Subversion eingecheckt habe und danach wieder ausgecheckt habe, kann ich den Designer nicht mehr öffnen. Fehlermeldung in diesem Fall:

"Beim Laden des Designers sind die nachfolgend aufgeführten Fehler aufgetreten. Einige können durch Neuerstellen des Projekts behoben werden, andere erfordern möglicherweise Änderungen am Code. "

"Der Typ HMI.AButton wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde. "

Ich kann das Projekt aber noch ohne Probleme compilieren und meine Buttons erscheinen auch wie gewohnt.

Ich habe leider keine Ahnung, welche Dateien für ein Projekt notwendig sind und welche Visual Studio immer wieder selbstständig erstellt. Ich habe alle Dateien außer die Ordner "bin" und "obj" eingecheckt.

Es scheint, als ob die Verknüpfung zu dem FormsObjekt irgendwo in einer der erstellten *.Exe Dateien versteckt sind.

Anbei ein Screenshot meines Projektes mit der Fehlermeldung.

11.09.2007 - 06:49 Uhr

Vielen Dank! 👍
Hat geklappt. Das Thema wurde hier im Forum auch schon gelöst: Button ohne FocusRect (habe ich aber erst mit dem Stichwort ShowFocusCues gefunden)!

MfG
Thore

10.09.2007 - 14:52 Uhr

Hallo!
Folgendes Problem: Ich möchte einen Button mit Hintergrundbild verwenden. Dieser Button soll bei einem Klick auf diesen ein anderes Bildchen laden (so, dass dieser geklickt aussieht). Die Bilder habe ich schon dafür. Die Eigenschaften, die das Rollover usw. ausschalten habe ich auch schon verändert.

Das sieht auch alles schon ganz gut aus. Nur wenn ich den Button drücke wird dieser natürlich auch selektiert und dann erscheint ein häßlicher dunkelgrauer Rahmen um den Button, den ich dort nicht haben möchte. Kann ich das irgendwie ausschalten? Farbe ändern (wie bei den anderen Eigenschaften BorderColor, MouseDownBackColor, etc.)?

Ich möchte eigentlich den Button verwenden, weil ich dort eine ImageList einbinden kann, wo ich beim Drücken nur den Index des Hintergrundbildes verändern muss (button1.ImageIndex = 3 ).

MfG
Thore

16.08.2007 - 12:49 Uhr

Vielen Dank für die rekordverdächtig schnelle Antwort (2 Minuten! RESPEKT!)! Genau danach habe ich gesucht.

Letztendlich sieht der Code jetzt so aus:


private void txtPictureDescription_KeyPress(object sender, KeyPressEventArgs e)
    {
      if (e.KeyChar == '\n')
      {
        e.Handled = true;
        SavePictureDescription();
        SelectNextPicture();
      }
    }

16.08.2007 - 12:40 Uhr

Hallo!
Folgendes Problem:
Ich habe eine Form kreiert, die eine mehrzeilige TextBox enthält. In dieser möchte ich auf die Tastenkombination <strg> + <enter> reagieren. Das ist soweit kein Problem. Wenn ich in meiner Textbox die Tastenkombination drücke, dann reagiere ich auf das KeyPress-Ereignis.


private void txtPictureDescription_KeyPress(object sender, KeyPressEventArgs e)
    {
      if (e.KeyChar == '\n')
      {
        SavePictureDescription();
        SelectNextPicture();
      }

    }

Mein Programm macht nun folgendes:

  • es nimmt den Text aus der Textbox und speichert diesen in eine Datei
  • danach läd es den nächsten Text aus einer Datei und setzt ihn mit der Zuweisung txtPictureDescription.Text = [neuerText] in die Textbox ein.

Mein Problem ist jetzt folgendes:
In der TextBox erscheint nun am Anfang ein "\r\n" (als Resultat der Tastenkombination vorher). D.h. in meiner Textbox erscheint eine Leerzeile am Anfang. Dies möchte ich aber natürlich nicht.
Ich lösche genau vor der Eingabe des neuen Textes den Inhalt der Textbox mittels: txtPictureDescription.Clear();
Wenn ich mit dem Visual Studio mit-trace, dann ist bis zum Ende der Text in der Textbox genauso, wie ich es möchte. Wenn die Form nach dem Tracen wieder erscheint, dann ist aber das "\r\n" am Anfang der Textbox.

Ich hoffe ich konnte mein Problem einigermaßen verständlich beschreiben. Dies ist mein erster Eintrag in einem Forum. Also ich bitte um Verständniss 😉