Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von schuppsl
Thema: String (Un)Boxing: Wird prim. Datentyp in object gewandelt-Kann toString() aufrufen? + Performance
Am im Forum: Grundlagen von C#

Hallo zusammen,

ich beschäftige mich gerade etwas mit den Grundlagen, Thema Boxing - unboxing.

Simpler Code:



            int iTest = 5;
            Console.WriteLine("Dies ist die Ausgabe:" + iTest);

Die Variable iTest ist zuerst ein primitiver Datentyp vom Typ integer mit genau 32 Bit.
Durch die CW-Anweisung wird die Variable iTest durch boxing in ein Object umgewandelt und die Funktion ToString() ausgeführt, anschließend wird der String mit dem vorstehenden Text angehängt (concat).
Dies ist schön im Disassembler zu sehen:

.locals init (int32 V_0)
  IL_0000:  nop
  IL_0001:  ldc.i4.5
  IL_0002:  stloc.0
  IL_0003:  ldstr      "Dies ist die Ausgabe:"
  IL_0008:  ldloc.0
  IL_0009:  box        [mscorlib]System.Int32
  IL_000e:  call       string [mscorlib]System.String::Concat(object,
                                                              object)
  IL_0013:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0018:  nop
  IL_0019:  ret


Zuerst der einfache Datentyp, dann mit der Anweisung box in ein Object umgewandelt. Anschließend wird String.Concat ausgeführt.


Zweites Beispiel:


int iTest = 5;
            Console.WriteLine("Dies ist die Ausgabe:" + iTest.ToString());
Hier wird direkt ToString() ausgeführt und somit kein boxing vorgenommen:
.locals init ([0] int32 iTest)
  IL_0000:  nop
  IL_0001:  ldc.i4.5
  IL_0002:  stloc.0
  IL_0003:  ldstr      "Dies ist die Ausgabe:"
  IL_0008:  ldloca.s   iTest
  IL_000a:  call       instance string [mscorlib]System.Int32::ToString()
  IL_000f:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
  IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0019:  nop
  IL_001a:  ret
Es wird die Methode String.Concat mit zwei Strings anstatt Objects ausgeführt.

Jetzt frage ich mich:
1. Warum ist das so? Ein primitiver Datentyp hat keine Methode Tostring(), daher wird dieser doch implizit auch in object umgewandelt???

2. ist das tatsächlich der bessere (performance) Weg?


Kann mir das jemand erklären?
Vielen Dank

Thema: Verschiedene Timer - selbiges .Elapsed Event?
Am im Forum: Grundlagen von C#

Ja!

Thema: Verschiedene Timer - selbiges .Elapsed Event?
Am im Forum: Grundlagen von C#

Alles klar, vielen Dank.

Thema: Verschiedene Timer - selbiges .Elapsed Event?
Am im Forum: Grundlagen von C#

Also Quell und Zieldateien sind entweder im Hauseigenen oder externen Netzlaufwerk.
Genauso wie du es beschreibst, dachte ich es mir und mMn nach ist genau das passiert: Die Events haben sich aufgeschaukelt und dann irgendwo im Nirwana gelandet.

Dann muss ich mir mal die genannten Frameworks anschauen. Vielen Dank.

Thema: Verschiedene Timer - selbiges .Elapsed Event?
Am im Forum: Grundlagen von C#

Vielen Dank.
Dann muss ich mal die Modi anschauen.
Wie kann man sowas "ungebastelt" umsetzen?

Thema: Verschiedene Timer - selbiges .Elapsed Event?
Am im Forum: Grundlagen von C#

Hallo zusammen.
Das Programm soll Dateien von A nach B kopieren, und nach dem Kopieren in einen Unterordner verschieben.
Dazu habe ich eine Windows Form, welches ein Datagridview enthält. In diesem kann man Quelle, Ziel und die Zeit eintragen in der das Programm von Quell nach Zielordner kopieren soll. Also z.B. alle 90 Sekunden.

Die verschiedenen Einträge speichere ich in einer XML Datei, welche ich per DataSet.ReadXml in ein DataSet in die erzeugte DataTable einlese.
Hier habe ich nun alle Pfade und den Intervall verfügbar.

Auf Knopfdruck sollen nun alle "Jobs" gestartet werden. Für jeden Job wird ein extra Timer gestartet.
Für jeden Timer gibt es dasselbe Event beim Auslösen.
Im Event wird festgestellt, welcher Timer das ist und anhand dessen die entsprechenden Dateien kopiert.

Das sieht so aus:

Beim Start, XML einlesen, für DataGridView die Source setzen, eine DataTable wird im DataSet automatisch erzeugt:


EinstellungenDataSet.ReadXml(filePath);
dataGridView1.DataSource = EinstellungenDataSet;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
dataGridView1.DataMember = "ToCopy";     

Nun sind alle Daten in der DataTable, Namens "ToCopy".

Gestartet wird das Ganze so:


foreach (DataRow row in EinstellungenDataSet.Tables[0].Rows)
{
if (rd[i] != null) { rd[i].disposeTimer(); rd[i] = null; }
.....
....
....
rd[i].time = row["time"].ToString();
....
....
rd[i].makeNewTimer();
rd[i].rTimer.Elapsed += rTimer_Elapsed;


....
...
...
 public void makeNewTimer()
        {
            rTimer = new System.Timers.Timer();
            rTimer.AutoReset = true;            
        }
...
...

Also für jeden Eintrag wird ein neuer Timer erstellt mit der eigenen Intervallzeit.

Das Elapsed Event sieht so aus:



void rTimer_Elapsed(object sender, ElapsedEventArgs e)
{            
//Welcher Timer?
 System.Timers.Timer myTimer= ((System.Timers.Timer)sender);
...
...
//Quell-und Zielpfad festlegen, Dateien im Quellpfad auflisten und jede Datei kopieren:
...
...
fileName = System.IO.Path.GetFileName(s);
destFile = System.IO.Path.Combine(zielPfad, fileName);
...
...
System.IO.File.Copy(s, System.IO.Path.Combine(archivPfad, fileName));
System.Threading.Thread.Sleep(20);
System.IO.File.Move(s, destFile);
System.Threading.Thread.Sleep(20);
...
...
...
usw.


Das Ganze wird ein einer Klasse gekapselt.

Das Ganze funktioniert ziemlich gut und läuft seit Monaten zuverlässig.
Gestern allerdings hatte ich ein Problem.
Ich habe zwei neue Einträge erstellt.
Quelle ist diesselbe, Ziele sind andere. Intervallzeit war gleich eingestellt auf 90 Sekunden.

(Habe es soweit umprogrammiert, dass man angeben kann, ob die Quelldateien bleiben sollen)
Also der 1. neue Eintrag kopiert von A nach B, lässt die Dateien aber im Quellverzeichnis.
2. neue Eintrag kopiert von A nach B2, verschiebt die Quelldateien aber ins Archiv Verzeichnis.

Soweit so gut.
Nach ca. 1 Stunde hatte ich gestern auf 16 Cores (vserver) 100% Auslastung - ausgelöst durch mein Programm.

Da es bisher lief, nehme ich an, dass es an den zwei neuen Einträgen liegt.
Bzw. es liegt wohl an:
1. an meiner Architektur und
2. daran, dass das Programm gleichzeitig (nach 90 sek), auf diesselben Dateien zugreift und diese einmal kopieren und andererseits verschieben möchte.
Kann das sein?

Auch wenn das Timer Event immer dasselbe ist, ist es jedoch jeweils ein anderer Timer und ein anderer Thread.


Die Quelle, Ziel und Archiv sind alle auf einem entfernten Freigabeverzeichnis:
Quelle: \\Freigabe\share\daten
Ziel: \\Freigabe\share\daten\ Ziel - Verzeichnis
Archiv: \\Freigabe\share\daten\Archiv


Aber auch wenn das Programm gleichzeitig auf die Dateien zugreift, sollte es sich doch nicht so verschlucken, dass es die CPU Last so in die Höhe treibt?
Hat jemand eine Erklärung?

Vielen Dank im Voraus-

Thema: Anderes Fenster in Vordergrund holen
Am im Forum: GUI: Windows-Forms

Altes Thema, selbiges Problem:

Auf meinem Windows 8.1 Rechner funktioniert das mit SetForegroundWindow einwandfrei, auf dem Zielrechner, welches ein Windows 7 Rechner ist, blinkt die Anwendung in der Taskleiste nur gelb und wird nicht in den Vordergrund geholt.
Auch mit dem Script über mir funktioniert es leider nicht.

Kann das auch an Benutzerrechten liegen?

Thema: Report erstellen und dabei bestimmte Einträge filtern
Am im Forum: Rund um die Programmierung

Also ich habe es nun gelöst, indem ich eine View mit den entsprechenden Daten erstellt und diese als Datenquelle angegeben habe.

Vielen Dank an alle.

Thema: [gelöst] SQL Select mit Subtraktion durch ein Subselect
Am im Forum: Datentechnologien

Vielen Dank, habe es selbst gelöst. Siehe EDIT oben :)

Thema: [gelöst] SQL Select mit Subtraktion durch ein Subselect
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: MS SQL.

Hallo liebes Forum, eigentlich dachte ich, dass ich mich mit SQL ganz gut auskenne, aber im Moment stehe ich auf dem Schlauch.

Ich möchte eine Auswertung machen, die mir eine Anzahl nach Jahr, Monat und Tag geordnet ausgibt.
Das an sich ist kein Problem und funktioniert.

Nun gibt es in der Tabelle ein Feld "storno". Die Anzahl dieser sollte ich pro Tag abziehen.
Also z.B. Anzahl am 22.9.: 135, 3x storno = 132.

Das sollte möglichst in einem SQL Aufruf geschehen, dazu habe ich verschiedene Versuche gemacht, keines geht aber.
Alternativen willkommen.

Also hier das Script, Anzahl pro Jahr, Monat und Tag:



  SELECT km.Monat, km.Tag, COUNT(km.tag)
  FROM [datenbank] as km
  where km.ausweisnr <> '0001234567'
  GROUP BY km.Monat,km.Tag
  order by km.monat, km.tag

Hier das Script, welches die Stornos ausgibt:


  SELECT  COUNT(tag)*2
  FROM [datenbank]
  where ausweisnr <> '0001234567' and Storno =1
  GROUP BY Monat,Tag
  order by monat, tag


Gesamtes habe ich bereits so implementiert:




  SELECT km.Monat, km.Tag, COUNT(km.tag)-(
  SELECT  COUNT(tag)*2
  FROM [datenbank]
  where ausweisnr <> '0001234567' and Storno =1
  GROUP BY Monat,Tag
  )
  FROM [datenbank] as km
  where km.ausweisnr <> '0001234567'
  GROUP BY km.Monat,km.Tag
  order by km.monat, km.tag

Geht natürlich nicht, da es mehrere Rückgaben gibt.
Aber wie geht es dann? Wie kann ich im inneren Select den Bezug zum aktuelle Jahr/Monat/Tag zum äußeren Select herstellen?
Geht das überhaupt so?

Vielen Dank im Voraus.

Edit:

Weiterer Versuch:

SELECT km.Monat, km.Tag, COUNT(km.tag)-(
  SELECT  COUNT(tag)*2
  FROM [datenbank]
  where ausweisnr <> '0001234567' and Storno =1
  and km.Monat = Monat and  km.Tag = tag
  GROUP BY Monat,Tag
  )
  FROM [datenbank] as km
  where km.ausweisnr <> '0001234567'
  GROUP BY km.Monat,km.Tag
  order by km.monat, km.tag

So läuft es, aber in der COUNT Spalte kommt oft NULL, bei wenigen kommt ein Zahlenwert...

Edit:

GROUP BY muss natürlich noch weg... dann gehts :)

Thema: Report erstellen und dabei bestimmte Einträge filtern
Am im Forum: Rund um die Programmierung

Kann man denn nicht auf die komplette Datenbank als Datenquelle zugreifen, egal ob auf die Datenbank oder Dataset und nachher die Daten einschränken mit den Ausdrücken?
Das wäre doch weitaus flexibler?

Thema: Report erstellen und dabei bestimmte Einträge filtern
Am im Forum: Rund um die Programmierung

- Windows Forms
- Was für einen Report? Keine Ahnung! Erstelle ich einen neuen Report, heißt die Datei Report2.rdlc
- Die kommen aus einem DataSet, welches per SELECT * alle Daten aus der Datenbank einliest.

Ein normaler SELECT wäre mir am liebsten, aber der Report möchte ja diese komischen Ausdrücke haben?

Thema: Report erstellen und dabei bestimmte Einträge filtern
Am im Forum: Rund um die Programmierung

Hallo liebes Forum.

Ich möchte auf Basis einer MS-SQL Tabelle einen Report erstellen, der mir zuerst tabellarisch die Einträge pro Jahr/Monat/Tag auflistet.
Hierbei soll es aber einige Bedingungen geben.

Im SQL Management Studio habe ich das Script bereits fertig, im Report allerdings hakt es gewaltig.
Per Wizard habe ich einen kleinen Report erstellt und kann mir bereits die Anzahl pro Monat anzeigen lassen.( COUNT )

Allerdings komme ich mit den Ausdrücken nicht klar.

Der bisherigen COUNT Ausdruck lautet:

=Count(Fields!AusweisNr.Value)

Nun sollen aber bestimmte Ausweisnummern nicht mit aufgezählt werden.
Hier zu habe ich bei uncle google nichts gefunden und meine verschiedenen Versuche zeigten auch keine Wirkung:



=Count(Fields!AusweisNr.Value <> "0001234567")
//Gleiche Anzahl

=Count(Fields!AusweisNr.Value <> 1234567)
//Gleiche Anzahl

//Gegenprobe:
=Count(Fields!AusweisNr.Value LIKE "0001234667")
//Gleiche Anzahl


Alle weiteren Versuche wie


=Count(Fields!AusweisNr.Value )<> 1234567

Bringen Fehlermeldungen beim Kompillieren.

Es kommen hier noch weitere SQL Abfragen dazu, damit die Anzahl nachher stimmt.


Ich denke, dass ich was grundsätzliches falsch mache.
Nur was?

Thema: Crystal Report als PDF speichern funktioniert aus dem VS heraus aber nicht im IIS
Am im Forum: Web-Technologien

Hallo Gemeinde,

CR soll auch abgeschafft werden, aber in diesem speziellen Fall muss ich daraus eine PDF erzeugen die dann archiviert wird.
Inzwischen funktioniert es auch, habe einige Tests gemacht.

Es lag wohl nur an der Datenbankverbindung, die nicht richtig konfiguriert war.
Warum weiss ich nicht, aber ich habe nun einen Datei DSN angelegt und nehme diesen als Verbindung zur Datenbank.

Also Vorgehensweise mit VS2013:
- vorhandene CR Datei löschen (falls bereits vorhanden)
- Neues Element hinzufügen->CR->CR Datei wählen
- Datenbankfelder->Datenbankassistent
- Hier dann die Datei auswählen, Daten eingeben und fertig.

Dann hier noch der geänderte Quellcode, falls es jemand helfen sollte:




   public bool CreateCrystalPDF(ref string err, string pdf_name)
        {

            CrystalReport1 ts = new CrystalReport1();
            ts.SetDatabaseLogon("User", "Passw","Server","Database");
            ts.DataSourceConnections[0].IntegratedSecurity = false;            

             crystalReportViewer1.ReportSource = ts;

                  ParameterFieldDefinitions parmFields = ts.DataDefinition.ParameterFields;
             foreach (ParameterFieldDefinition def in parmFields)
             {
                 if (!def.IsLinked())
                 {

                      switch (def.ValueType)
                     {
                         case CrystalDecisions.Shared.FieldValueType.StringField:
                             ts.SetParameterValue(def.Name, "", def.ReportName);
                             break;
                               
                         case CrystalDecisions.Shared.FieldValueType.NumberField:
                             ts.SetParameterValue(def.Name, 33090);
                             break;

                         default:
                             ts.SetParameterValue(def.Name, null, def.ReportName);
                             break;
                     }

                 }
             }

            ExportOptions CrExportOptions = new ExportOptions();
            DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();
            PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();
            //CrDiskFileDestinationOptions.DiskFileName = CrystalReportViewer1.ReportSourceClassFactoryName;

            CrFormatTypeOptions.FirstPageNumber = 1; // Start Page in the Report
            CrFormatTypeOptions.LastPageNumber = 2; // End Page in the Report
            CrFormatTypeOptions.UsePageRange = true;

            CrDiskFileDestinationOptions.DiskFileName = pdf_name;

            CrExportOptions = ts.ExportOptions;
            CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
            CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
            CrExportOptions.ExportDestinationOptions = CrDiskFileDestinationOptions;

            CrExportOptions.ExportFormatOptions = CrFormatTypeOptions;

            try
            {
                ts.Export();
                return true;
            }
            catch (DataSourceException dsex)
            {
                err = "Eins:" + dsex.Message;
                if (dsex.InnerException != null)
                    err += dsex.InnerException;
                return false;
            }

            catch (EngineException enex)
            {
                if (enex.ErrorID == EngineExceptionErrorID.DataSourceError)
                {

                    err = "An error has occurred while connecting to the database. ErrorCode: " + enex.ErrorID;
                }
                else if (enex.ErrorID == EngineExceptionErrorID.ExportingFailed)
                {

                    err = "ExportingFailed " + enex.ErrorID;
                }

                else if (enex.ErrorID == EngineExceptionErrorID.LogOnFailed)
                {

                    err = "Incorrect Logon Parameters. Check your user name and password. " + enex.ErrorID;
                }


                else if (enex.ErrorID == EngineExceptionErrorID.IndexOutOfBound)
                    err = "Indexoutofbound" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InternalError)
                    err = "Internal Error" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidArgument)
                    err = "InvalidArgument" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidExportOptions)
                    err = "InvalidExportOptions" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidFormula)
                    err = "InvalidFormula" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidParameterField)
                    err = "InvalidParameterField" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidParameterValue)
                    err = "InvalidParameterValue" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidPrintOptions)
                    err = "InvalidPrintOptions" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.LoadingReportFailed)
                    err = "LoadingReportFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.LogOnFailed)
                    err = "LogOnFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.MissingParameterFieldCurrentValue)
                    err = "MissingParameterFieldCurrentValue" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.OpenSubreportFailed)
                    err = "OpenSubreportFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.OutOfLicense)
                    err = "OutOfLicense" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.PageFormattingFailed)
                    err = "PageFormattingFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.PrintingFailed)
                    err = "PrintingFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.SavingReportFailed)
                    err = "SavingReportFailed" + enex.ErrorID;

                else err = enex.ErrorID.ToString();


                return false;

            }


            catch (Exception ex)
            {
                err = "else: " + ex.Message;
                if (ex.InnerException != null)
                    err += ex.InnerException;
                return false;
            }
            return true;
        }







Thema: Crystal Report als PDF speichern funktioniert aus dem VS heraus aber nicht im IIS
Am im Forum: Web-Technologien

Hallo und vielen Dank, hat leider alles nichts gebracht, es kommt immer noch Fehler -256 .
Im Internet ist nichts darüber zu lesen.

Thema: LiveTicker - Text erneut rechts einblenden, bevor er links ganz aus dem Bildschirm läuft
Am im Forum: GUI: WPF und XAML

Hallo Community,

vielleicht hat einer von Euch eine Idee.
Ich baue gerade einen kleinen Datenbankbasierten LiveTicker, welcher Texte aus eben dieser anzeigt. Die Texte laufen als eine Art "N24 Newsticker" über den Bildschirm.
Alles funktioniert, nur habe ich noch eine Unschönheit.
Der Text läuft links erst komplett aus dem Bild, bevor er rechts erneut erscheint.
Es soll aber so sein, dass der Text Anfang erneut zu sehen ist, auch wenn der Text links noch nicht ganz rausgelaufen ist.
Es soll also der Ticker nie leer sein, sondern mit einem gewissen Abstand durchlaufen.
Leider habe ich keinerlei Idee dazu, außer einen zweiten doubleanimation- Ticker an derselben Position zu programmieren.
Nur hat das zur Folge, dass der zweite Ticker zwar später startet, aber beide enden gleichzeitig, d.h. der zweite überholt den ersten :)



  #region SQL
            using (DataClasses1DataContext con = new DataClasses1DataContext())
            {
 IEnumerable<string> text = from t in con.TRNewsticker where t.bereich1 == "1" select t.meldung;
              

                //for (int i = text.Count()-1; i ≥0; i--)
                //{
                //    TickerText += " +++ " + text.ElementAt(i);                    
                //}
                //TickerText += " +++ ";

                foreach (string item in text)
                {
                     TickerText += " +++++ " + item.ToString();

                }
                TickerText += " +++++ ";
                tbmarquee.Text = TickerText;
                tbmarquee1.Text = TickerText;
            }

            #endregion


            Rect desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
            //This = Window1
            //this.Left = desktopWorkingArea.Right - this.Width;
            this.Top = desktopWorkingArea.Bottom-this.Height;//1560-50
            this.Width = desktopWorkingArea.Width -10;      //2560-10, weil this.Left = 5      
            this.Left = 5;
            
            //Mit Faktor
            if (dFaktor != 1.0)
            {
                this.Height *= dFaktor;                
                tbmarquee.FontSize *= dFaktor;
                tbmarquee1.FontSize *= dFaktor;

                this.Top = desktopWorkingArea.Bottom - (this.Height);//1560-50
                this.Width = desktopWorkingArea.Width - 10;      //2560-10, weil this.Left = 5      
            }

#region Erster Ticker
            doubleAnimation.From = -tbmarquee.Width;// +Convert.ToDouble(offset);
            doubleAnimation.To = canMain.ActualWidth;
            doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
            doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(ToDouble(dur, false)));
            clock = doubleAnimation.CreateClock();
            tbmarquee.ApplyAnimationClock(Canvas.RightProperty, clock);
#endregion


            #region Zweiter Ticker
            doubleAnimationRepeat.From = (-tbmarquee1.Width * 2)-1000;// + Convert.ToDouble(offset);
            doubleAnimationRepeat.To = canMain.ActualWidth;
            //doubleAnimationRepeat.BeginTime = TimeSpan.FromSeconds(ToDouble(dur, false));
           // doubleAnimationRepeat.By = ToDouble(dur, false);
            
            doubleAnimationRepeat.RepeatBehavior = RepeatBehavior.Forever;
            doubleAnimationRepeat.Duration = new Duration(TimeSpan.FromSeconds(ToDouble(dur, false)));
            clockRepeat = doubleAnimationRepeat.CreateClock();
            tbmarquee1.ApplyAnimationClock(Canvas.RightProperty, clockRepeat);
            #endregion


Und der XAML:
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Background="Wheat"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Name="KNOLL_LiveTicker" x:Class="Marquee.Window1"
        Title="KNOLL LiveTicker" WindowStartupLocation="Manual" Loaded="Window_Loaded" ResizeMode="NoResize" Topmost="True" Cursor="Hand" Height="50" Opacity="0.8" WindowStyle="None" HorizontalAlignment="Left" VerticalAlignment="Bottom" d:DesignWidth="1025" ShowInTaskbar="False">


    <Canvas Canvas.Left="29" x:Name="canMain" Background="Wheat" Panel.ZIndex="100" RenderTransformOrigin="0.495,0.099" Height="0" VerticalAlignment="Top"   >

         <TextBlock Margin="0" FontSize="36" x:Name="tbmarquee1" Opacity="0.8" MouseDown="tbmarquee1_MouseDown" MouseUp="tbmarquee1_MouseUp"  Background="Transparent" Width="{Binding Path=ActualWidth, ElementName=tbmarquee1}">
            <TextBlock.Effect>
                <DropShadowEffect Opacity="0.5" ShadowDepth="2"/>
            </TextBlock.Effect><Run Text=""/></TextBlock>
        
        <TextBlock Margin="0" FontSize="36" x:Name="tbmarquee" Opacity="0.8" MouseDown="tbmarquee_MouseDown" MouseUp="tbmarquee_MouseUp"  Background="Transparent" Width="{Binding Path=ActualWidth, ElementName=tbmarquee}">
            <TextBlock.Effect>
                <DropShadowEffect Opacity="0.5" ShadowDepth="2"/>
            </TextBlock.Effect><Run Text=""/></TextBlock>
        
       
    </Canvas>





</Window>

Thema: Crystal Report als PDF speichern funktioniert aus dem VS heraus aber nicht im IIS
Am im Forum: Web-Technologien

Hallo zusammen,

wieder einmal das alte Thema:

Innerhalb der Entwicklungsumgebung mit VS2013 läuft die Erstellung des Crystal Reports und das Erzeugen und speichern des PDF's einwandfrei.
Veröffentliche ich die ASP.NET Seite im IIS, geht es natürlich nicht - weder auf meinem Entwicklungsrechner, noch auf dem Zielserver.

Der Fehler:
Scheint eine EngineException zu sein.
Zwar habe ich alle möglichen Fehlermöglichkeitenabgefangen, aber es wird nur -256 angezeigt.
Er läuft also ins "else" rein, die FehlerID ist 256.
Leider finde ich so gar nichts im Internet dazu.

Fange ich die Exception allgemein ab, kommt die Meldung:

Fehler
Fehler beim Öffnen der Verbindung. temp_dad71e64-5e79-4011-b37c-51401aa07196 2940_1756_{1EDBA7EA-D13F-4269-BB76-0320102BCA57}.rptSystem.Runtime.InteropServices.COMException (0x800002F4): Fehler beim Öffnen der Verbindung. Fehler beim Öffnen der Verbindung. temp_dad71e64-5e79-4011-b37c-51401aa07196 2940_1756_{1EDBA7EA-D13F-4269-BB76-0320102BCA57}.rpt at CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) at CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)


- Crystalreport Viewer13 ist installiert.
- IIS 8.5 auf Windoes Server 2012

Quellcode für das Erzeugen:

 public bool CreateCrystalPDF(ref string err, string pdf_name)
        {

            C_PumpTS ts = new C_PumpTS();
            ts.SetDatabaseLogon("User", "Password");
            ts.DataSourceConnections[0].IntegratedSecurity = false;

            // CrystalReportViewer1.ReportSource = ts;

            ts.SetParameterValue("Prüfnummer", GlobalVar.PruefNummer);

            ExportOptions CrExportOptions = new ExportOptions();
            DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();
            PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();
            //CrDiskFileDestinationOptions.DiskFileName = CrystalReportViewer1.ReportSourceClassFactoryName;

            CrFormatTypeOptions.FirstPageNumber = 1; // Start Page in the Report
            CrFormatTypeOptions.LastPageNumber = 2; // End Page in the Report
            CrFormatTypeOptions.UsePageRange = true;

            CrDiskFileDestinationOptions.DiskFileName = pdf_name;

            CrExportOptions = ts.ExportOptions;
            CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
            CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
            CrExportOptions.ExportDestinationOptions = CrDiskFileDestinationOptions;

            CrExportOptions.ExportFormatOptions = CrFormatTypeOptions;

            try
            {
                ts.Export();
                return true;
            }
            catch(DataSourceException dsex)
            {
                err = "Eins:" + dsex.Message;
                if (dsex.InnerException != null)
                    err += dsex.InnerException;
                return false;
            }

                catch(EngineException enex)
            {
                    

                if (enex.ErrorID == EngineExceptionErrorID.DataSourceError)
                {

                    err = "An error has occurred while connecting to the database. ErrorCode: " + enex.ErrorID;
                }
                else if (enex.ErrorID == EngineExceptionErrorID.ExportingFailed)
                {

                    err = "ExportingFailed " + enex.ErrorID;
                }

                else if (enex.ErrorID == EngineExceptionErrorID.LogOnFailed)
                {

                    err = "Incorrect Logon Parameters. Check your user name and password. " + enex.ErrorID;
                }


                else if (enex.ErrorID == EngineExceptionErrorID.IndexOutOfBound)
                    err = "Indexoutofbound" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InternalError)
                    err = "Internal Error" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidArgument)
                    err = "InvalidArgument" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidExportOptions)
                    err = "InvalidExportOptions" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidFormula)
                    err = "InvalidFormula" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidParameterField)
                    err = "InvalidParameterField" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidParameterValue)
                    err = "InvalidParameterValue" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.InvalidPrintOptions)
                    err = "InvalidPrintOptions" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.LoadingReportFailed)
                    err = "LoadingReportFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.LogOnFailed)
                    err = "LogOnFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.MissingParameterFieldCurrentValue)
                    err = "MissingParameterFieldCurrentValue" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.OpenSubreportFailed)
                    err = "OpenSubreportFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.OutOfLicense)
                    err = "OutOfLicense" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.PageFormattingFailed)
                    err = "PageFormattingFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.PrintingFailed)
                    err = "PrintingFailed" + enex.ErrorID;
                else if (enex.ErrorID == EngineExceptionErrorID.SavingReportFailed)
                    err = "SavingReportFailed" + enex.ErrorID;

                else err = enex.ErrorID.ToString();


                return false; 

            }


            catch (Exception ex)
            {
                err = "else: "+ex.Message;
                if (ex.InnerException != null)
                    err += ex.InnerException;
                return false;
            }
            return true;
        }


In der Entwicklungsumgebung habe ich Crystal für VisualStudio installiert und den Report aus dem Werkzeugkasten "reingezogen".

Any suggestions?

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

Also als Rückmeldung:
Inzwischen klappt es einwandfrei...manchmal muss man einfach nur etwas Zeit verstreichen lassen :)

Vielen Dank an alle.

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

Also Https ist definitiv nicht notwendig, wir haben den Webservice mit dem Consultant zum Test extra ohne aufgesetzt.

Ja, es sind Grundlagen die fehlen.
Aber ich denke wenn ich schon einen so tolle Wizard habe, warum muss ich dann noch selbst Hand anlegen?

Egal.
Ich habe verschiedene Dinge durchprobiert und es steht i.d.R. nirgends etwas über einen Proxy und wie man diesen angibt.
Zudem ist der SAP Server im Proxy als Ausnahme drin, d.h. hier wird kein Proxy benötigt.

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

...und hier das etc:

Fehler
Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung mit dem Remoteserver kann nicht hergestellt werden..
System.Net.Sockets.SocketException (0x80004005): Ein ungültiges Argument wurde angegeben
bei System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
bei System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
bei System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
bei System.Net.Connection.CompleteStartConnection(Boolean async, HttpWebRequest httpWebRequest)

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

Also ich weiss überhaupt nicht wo ich was einstellen muss.

Habe nochmal ein neues Projekt erstellt und den SAP Webservice als Dienstverweis hinzugefügt.

So sieht die Original automatisch erstellte App.config aus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <client>
            <endpoint address="http://serveradress:8000/sap/bc/srt/rfc/sap/zkn_select_lifnr_altkn/100/zkn_select_lifnr_altkn/zkn_select_lifnr_altkn"
                binding="customBinding" bindingConfiguration="ZKN_SELECT_LIFNR_ALTKN"
                contract="ServiceReference2.ZKN_SELECT_LIFNR_ALTKN" name="ZKN_SELECT_LIFNR_ALTKN" />
            <endpoint address="http://serveradress:8000/sap/bc/srt/rfc/sap/zkn_select_lifnr_altkn/100/zkn_select_lifnr_altkn/zkn_select_lifnr_altkn"
                binding="customBinding" bindingConfiguration="ZKN_SELECT_LIFNR_ALTKN_soap12"
                contract="ServiceReference2.ZKN_SELECT_LIFNR_ALTKN" name="ZKN_SELECT_LIFNR_ALTKN_soap12" />
        </client>
        <bindings>
            <customBinding>
                <binding name="ZKN_SELECT_LIFNR_ALTKN">
                    <!--    WsdlImporter ermittelte unerkannte Richtlinienassertionen in ServiceDescription "urn:sap-com:document:sap:soap:functions:mc-style":    -->
                    <!--    <wsdl:binding name='ZKN_SELECT_LIFNR_ALTKN'>    -->
                    <!--        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">..</sapattahnd:Enabled>    -->
                    <mtomMessageEncoding messageVersion="Soap11WSAddressing10" />
                    <httpsTransport authenticationScheme="Basic" />
                </binding>
                <binding name="ZKN_SELECT_LIFNR_ALTKN_soap12">
                    <!--    WsdlImporter ermittelte unerkannte Richtlinienassertionen in ServiceDescription "urn:sap-com:document:sap:soap:functions:mc-style":    -->
                    <!--    <wsdl:binding name='ZKN_SELECT_LIFNR_ALTKN_soap12'>    -->
                    <!--        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">..</sapattahnd:Enabled>    -->
                    <mtomMessageEncoding />
                    <httpsTransport authenticationScheme="Basic" />
                </binding>
            </customBinding>
        </bindings>
      
    </system.serviceModel>
</configuration>

Und mein Aufruf:


 WindowsFormsApplication2.ServiceReference2.ZKN_SELECT_LIFNR_ALTKNClient soap = new ServiceReference2.ZKN_SELECT_LIFNR_ALTKNClient();

            soap.ClientCredentials.UserName.UserName = "user";
            soap.ClientCredentials.UserName.Password = "passw";
        
            WindowsFormsApplication2.ServiceReference2.ZknSelectLifnrAltkn req = new ServiceReference2.ZknSelectLifnrAltkn();
            WindowsFormsApplication2.ServiceReference2.ZknSelectLifnrAltknResponse response = new ServiceReference2.ZknSelectLifnrAltknResponse();


            req.Altkn = "100000";
            try
            {
                response = soap.ZknSelectLifnrAltkn(req);
            }catch (Exception ex)
            {
                MessageBox.Show(ex.Message + Environment.NewLine + ex.InnerException);
            }
ZKNSelect... ist einfach einj kleiner Echo Service, ich gebe was mit und bekomme was zurück.

Starte ich das Ganze dann, kommt als erstes die Meldung:
Fehler
Zusätzliche Informationen: Ein Endpunktkonfigurationsabschnitt für Vertrag "ServiceReference2.ZKN_SELECT_LIFNR_ALTKN" konnte nicht geladen werden, da mehr als eine Endpunktkonfiguration für diesen Vertrag gefunden wurde. Geben Sie den bevorzugten Endpunktkonfigurationsabschnitt mit Namen an.

Dann entferne ich einen endpoint, dann die das so aus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <client>
           <!-- <endpoint address="http://serveradress:8000/sap/bc/srt/rfc/sap/zkn_select_lifnr_altkn/100/zkn_select_lifnr_altkn/zkn_select_lifnr_altkn"
                binding="customBinding" bindingConfiguration="ZKN_SELECT_LIFNR_ALTKN"
                contract="ServiceReference2.ZKN_SELECT_LIFNR_ALTKN" name="ZKN_SELECT_LIFNR_ALTKN" />-->
            <endpoint address="http://serveradress:8000/sap/bc/srt/rfc/sap/zkn_select_lifnr_altkn/100/zkn_select_lifnr_altkn/zkn_select_lifnr_altkn"
                binding="customBinding" bindingConfiguration="ZKN_SELECT_LIFNR_ALTKN_soap12"
                contract="ServiceReference2.ZKN_SELECT_LIFNR_ALTKN" name="ZKN_SELECT_LIFNR_ALTKN_soap12" />
        </client>
        <bindings>
            <customBinding>
                <binding name="ZKN_SELECT_LIFNR_ALTKN">
                    <!--    WsdlImporter ermittelte unerkannte Richtlinienassertionen in ServiceDescription "urn:sap-com:document:sap:soap:functions:mc-style":    -->
                    <!--    <wsdl:binding name='ZKN_SELECT_LIFNR_ALTKN'>    -->
                    <!--        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">..</sapattahnd:Enabled>    -->
                    <mtomMessageEncoding messageVersion="Soap11WSAddressing10" />
                    <httpsTransport authenticationScheme="Basic" />
                </binding>
                <binding name="ZKN_SELECT_LIFNR_ALTKN_soap12">
                    <!--    WsdlImporter ermittelte unerkannte Richtlinienassertionen in ServiceDescription "urn:sap-com:document:sap:soap:functions:mc-style":    -->
                    <!--    <wsdl:binding name='ZKN_SELECT_LIFNR_ALTKN_soap12'>    -->
                    <!--        <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">..</sapattahnd:Enabled>    -->
                    <mtomMessageEncoding />
                    <httpsTransport authenticationScheme="Basic" />
                </binding>
            </customBinding>
        </bindings>
      
    </system.serviceModel>
</configuration>

Dann kommt die Meldung:
Fehler
Das bereitgestellte URI-Schema http ist ungültig; erwartet wurde "https".
Parametername: via

Danach ändere ich httpstransport zu httptransport.


Dann bekomme ich die Fehlermeldunghttp://www.mycsharp.de/wbb2/images/bbcode_csharp.adler.gif:
Fehler
Fehler beim Erstellen des Webproxys, der Im Konfigurationsabschnitt System.net/defaultProxy angegben ist.
...Socketexception usw...
Mit dem Tool SoapUI geht es einfandfrei.
Wo ist denn der Fehler? Was muss ich wo angeben?


Edit:
Setze ich das hier ein, kommt wieder die Meldung:
Fehler
Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung mit dem Remoteserver kann nicht hergestellt werden




<system.net>
     <defaultProxy enabled ="false">
       <proxy autoDetect ="True"/>
     </defaultProxy>
   </system.net>

 

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

Hallo telnet, vielen Dank für die ausführliche Antwort.
Ich muss mich hier erst einfuchsen, habe früher viel mit Webservices gemacht, das ist aber ne Weile her und das holt mich jetzt wieder ein.

Im soamanager ist die SOAP Version 1.1 und 1.2.

Mit dem WSDL File habe ich es auch schon versucht, keine Chance, zumal der Assisten im Visual Studio nicht die korrekten Verbindungseinstellungen generiert (irgendwo gelesen).


Mit einem Freewaretool ist es überhaupt kein Problem den Webservice anzusprechen und mit ihm zu kommunizieren, also der Funktioniert grundsätzlich.

Also ich muss wohl einiges nachholen :)

Thema: SAP RFC Webservice mit C#
Am im Forum: Netzwerktechnologien

Hallo Zusammen,

wir haben einen SAP RFC Webservice, dem ich mit einem C# Programm Daten entlocken sollte.
Das soll später eine Windowsanwendung sein, im Moment ist es eine Konsolenanwendung.

Nach einem Mittag versuchen und gefühlte 1000 Webseiten durchforschen bin ich langsam am verzweifeln.

Der Webservice ist per Webbrowser erreichbar.
Der Webservice ist per Nintex Workflow im SharePoint erreichbar und er kommuniziert auch. Also der Webservice ist definitiv in Ordnung.
Nun gibt es 100 verschiedene Möglichkeiten einen Webservice einzubinden und ich habe auch schon in vergangenen Projekten u.a. eigen programmierte Webservices angesprochen.



Nur hier komme ich nicht weiter.

Hier meine Web.config:



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WsCall.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>


  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpEndpunkt" >
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
      <wsDualHttpBinding>
        <binding name="HttpEndpunkt" ></binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://xxxxxx:8000/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zkn_select/100/zkn_select/zkn_select?sap-client=100" binding="netTcpBinding" bindingConfiguration="NetTcpEndpunkt" contract="ServiceReference1.ZKN_SELECT" name="NetTcpendpunkt" />
    </client>
  </system.serviceModel>
  
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    
  <system.net>
    <defaultProxy enabled="false"></defaultProxy>
  </system.net>
  <applicationSettings>
    <WsCall.Properties.Settings>
      <setting name="WsCall_refZKN_SELECT_ZKN_SELECT" serializeAs="String">
        <value>[URL]http://xxxxxxxx:8000/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zkn_select/100/zkn_select/zkn_select?sap-client=100[/URL]</value>
      </setting>
    </WsCall.Properties.Settings>
  </applicationSettings>
</configuration>






Und hier die Programmierung:

 System.Net.NetworkCredential cr = new System.Net.NetworkCredential("user", "passw");

                refZKN_SELECT.ZknSelect ws = new refZKN_SELECT.ZknSelect();
                refZKN_SELECT.ZKN_SELECT ff = new refZKN_SELECT.ZKN_SELECT();
                ff.Credentials = cr;

                ff.Url = "http://xxxxxx:8000/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zkn_select/100/zkn_select/zkn_select?sap-client=100";
                ff.UseDefaultCredentials = true;

                refZKN_SELECT.ZknSelectResponse res = new refZKN_SELECT.ZknSelectResponse();

                ws.Lifnr = "100000";
              


                ff.ZknSelect(ws);

Die aktuelle Fehlermeldung lautet:
Fehler
Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung mit dem Remoteserver kann nicht hergestellt werden..

Den Service habe ich mit dem Wizard von Visual Studio 2013 eingefügt, hier habe ich die Adresse zum Test erneut eingefügt.
Wir haben hier in der Firma einen Proxy, die URL(xxxxxx) ist aber als Ausnahme eingefügt und wie gesagt, per Webbrowser und Testclient problemlos erreichbar

Was läuft hier falsch?
Ich hoffe sehr, mir kann jemand helfen, da es ein wichtiges Projekt darstellt und die Zeit natürlich drängt...

Vielen Dank!

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Analog zu dem verlinkten Beispiel geht es auch nicht in diesem Event... scheint also definitiv das falsche zu sein.

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Guten Morgen.

Also ich mache das ganze Prozedere ja im Event CellValueChanged.
Liegt es vielleicht daran?

Irgendwie muss ich ja feststellen, ob eine Zeile oder Zelle geändert wurde und dieses abfangen und in die DB schreiben. Per Button möchte ich das nicht machen, sondern direkt bei Änderung bzw. neuer Zeile.
Habe schon etliche Events ausprobiert und das erscheint mir als das sinnvollste.
Kann es daran liegen?

EDIT: Also nach diesem Beispiel geht es, einfacher geht es nicht mehr.

Allerdings muss man dafür einen Button drücken, was oft vergessen wird. Daher hätte ich das gerne in einem Event. Welches wäre hier am sinnvollsten?

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Ja, der Insert funktioniert.

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Ja leider wird trotzdem nichts zurückgeschrieben...auch wenn ich es ganz minimal erstelle wie in deinem Beispiel...

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Habe ich gerade versucht, bringt leider nichts...

Thema: [gelöst] Datatable.NewRow fügt zwei weitere Rows hinzu
Am im Forum: Datentechnologien

Ich habe es gefunden. Ich benutze den adapter weiter oben schon für eine Zuweisung, daher sind hier wohl noch "Reste" enthalten, die mit in die DataTable geschrieben werden.
Vielen Dank.

Thema: Speichern von Änderungen in Datenbank ghet nicht: SqlDataAdapter, Commandbuilder
Am im Forum: Datentechnologien

Hallo.
entweder bin ich heute schon total neben der Kapp oder ich bin Urlaubsreif:

Ich binde eine DataTable an eine DataGridViewSource:



   con = new SqlConnection(Properties.Settings.Default.MietkleidungConnectionString);
            string befehl = "SELECT mt.ID, mt.PersonalID, mt.Menge, mt.KleidungsID, mt.Schluesselnummer, mt.Groesse FROM miete mt";
            adapMiete = new SqlDataAdapter(befehl, con);
            
            datatMiete = new DataTable("Verwaltung");
           datatMiete.Locale = System.Globalization.CultureInfo.InvariantCulture;
            adapMiete.Fill(datatMiete);
[B]            cmbl = new SqlCommandBuilder(adapMiete);            [/B]
            dataGridViewMiete.DataSource = datatMiete;
           
            datatMiete.PrimaryKey =  new DataColumn[]{datatMiete.Columns["ID"]};


Funktioniert soweit und die Daten werden im DataGridView angezeigt.
Auch der Insert funktioniert, das mache ich über das CellValueChanges Event:



DataRow row = datatMiete.NewRow();
                row[0] = ++x;
                row[1] = dataGridViewMiete.Rows[e.RowIndex].Cells[1].Value.ToString() == "" ? 2 : Convert.ToInt32(dataGridViewMiete.Rows[e.RowIndex].Cells[1].Value);
                row[2] = dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value.ToString() == "" || dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value == DBNull.Value ? 0 : Convert.ToInt16(dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value);
                row[3] = dataGridViewMiete.Rows[e.RowIndex].Cells[3].Value.ToString() == "" ? 22 : Convert.ToInt16(dataGridViewMiete.Rows[e.RowIndex].Cells[3].Value);
                row[4] = dataGridViewMiete.Rows[e.RowIndex].Cells[4].Value.ToString() == "" ? "112233" : dataGridViewMiete.Rows[e.RowIndex].Cells[4].Value.ToString();
                row[5] = dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value.ToString() == "" || dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value == DBNull.Value ? "0" : dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value.ToString(); ;
[B]
datatMiete.Rows.Add(row);
 adapMiete.Update(datatMiete);[/B]



Geht soweit.
Im selben event möchte ich nun Änderungen speichern:


*Haltepunkt
DataRow row = datatMiete.Rows[e.RowIndex];
                datatMiete.Rows[e.RowIndex][0] = x;
                datatMiete.Rows[e.RowIndex][1] = dataGridViewMiete.Rows[e.RowIndex].Cells[1].Value.ToString();// == "" ? 2 : Convert.ToInt32(dataGridViewMiete.Rows[e.RowIndex].Cells[1].Value);
                datatMiete.Rows[e.RowIndex][2] = dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value.ToString();// == "" || dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value == DBNull.Value ? 0 : Convert.ToInt16(dataGridViewMiete.Rows[e.RowIndex].Cells[2].Value);
                datatMiete.Rows[e.RowIndex][3] = dataGridViewMiete.Rows[e.RowIndex].Cells[3].Value.ToString();// == "" ? 22 : Convert.ToInt16(dataGridViewMiete.Rows[e.RowIndex].Cells[3].Value);
                datatMiete.Rows[e.RowIndex][4] = dataGridViewMiete.Rows[e.RowIndex].Cells[4].Value.ToString();// == "" ? "112233" : dataGridViewMiete.Rows[e.RowIndex].Cells[4].Value.ToString();
                datatMiete.Rows[e.RowIndex][5] = dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value.ToString();// == "" || dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value == DBNull.Value ? "0" : dataGridViewMiete.Rows[e.RowIndex].Cells[5].Value.ToString(); ;
                //      MessageBox.Show(adapMiete.UpdateCommand.CommandText);

           //     DataRowState state = row.RowState;
             //   DataTable getch = datatMiete.GetChanges();
                adapMiete.Update(datatMiete);



Also ich schnappe mir den RowIndex und speichere die Änderungen im Datatable.
Das Problem hierbei ist nun, dass der RowState immer auch "unchanged" steht bzw. GetChanges = null ist.

Die Tabelle hat 6 Spalten. Ändere ich die Dritte, kann ich mir das ja anschauen im Debugger.

Haltepunkt ist auf der ersten Zeile, hier schaue ich nun in die DataTable den einen Wert an.
An dieser Stelle ist dieser aber schon eingetragen, obwohl ich die Zuweisungen noch gar nicht durchlaufen habe.
Daher ist RowState auch immer unchanged.
Doch woher kommt das? Warum ist in der DataTable der geänderte Wert schon aktualisiert, obwohl ich den erst hier zuweise?