C# Visalstudio 2010 - Informix Datenbank

speedsam

Cadet 2nd Year
Registriert
Sep. 2014
Beiträge
22
Guten Tag,

ich habe ein Problem in meiner C# WPF anwendung...

ich würde gerne Daten aus einer Informix Datenbank rausholen, und diese in C# anzeigen lassen.
ich habe auch eine entsprechende Database.cs klasse, welche den INFORMIX connect erstellt ( dieser auch funktioniert).

meine Daten welche ich aus der Datenbank bekomme sind wiefolgt:
Datetime, money,money,money

diese sind einer liste(?) hinzuzufügen.

cmd = new IfxCommand(sql, ifx);

MessageBox.Show("IFxClose");
using (IfxDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
liste.Add(new GesamtUmsatz(reader.GetDateTime(0), reader.GetDecimal(1), reader.GetDecimal(2), reader.GetDecimal(3)));

MessageBox.Show("lese...");

}
MessageBox.Show(reader.GetString(0) + reader.GetDecimal(1) + reader.GetDecimal(2) + reader.GetDecimal(3));
ifx.Close();
return liste;



die Klasse GesamtUmsatz hätte ich so gestaffelt:
public class GesamtUmsatz
{
public DateTime? TagesDatum { get; set; }
public decimal? Umsatz { get; set; }
public decimal? Gutschrift { get; set; }
public decimal? Gesamtumsatz { get; set; }

public GesamtUmsatz(DateTime? tagesdatum, decimal? umsatz, decimal? gutschrift, decimal? gesamtumsatz)
{
TagesDatum = tagesdatum;
Umsatz = umsatz;
Gutschrift = gutschrift;
Gesamtumsatz = gesamtumsatz;
}
public override string ToString()
{
return string.Format("{0} {1} {2} {3}", TagesDatum, Umsatz, Gutschrift, Gesamtumsatz);
}
}

und die Daten der DB
ist einmal Datetim(informi),Money(informix)[$24.24],money,money..

brauche euere hilfe!!!
ich möchte dieses in einem extra Fenster anzeigen lassen. ShowDiaog(); (muss ich hier in diesem Dialog die Datenbank Initialisieren , und dort aufrufen, oder mus ich die Liste einfahc nur dem Dialog übergeben... :/
mache ich es richtig mit der Liste<> usw??

fruee mich über euere antworten, danke schon eimal
 
Zuletzt bearbeitet:
Hallo,
du kannst beides machen. Sowohl die Abfrage im Dialog als auch das Resultset (als Liste oder wie auch immer) an das Dialogfenster übergeben (z.B. per Konstruktor) und dann dort die Werte z.B. mit einem DataGrid anzeigen.

Greetz
hroessler
 
das gibt ein problem eben mit Datagrid.. habe framework 3.5 eintellen müssen, ( weil ich auf windows srever 2003 drauf mus) und da gibt es keinen Datagrid sonder nur ein GRid. .::::/
Ergänzung ()

mir kommt da eine Exception:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt...

hier nocheinmal mein aufruf:
aus dem Untersten Usercontroll
InitializeComponent();
Database _db = new Database();


List<UmsatzZahlen.Klassen.GesamtUmsatz> liste = new List<UmsatzZahlen.Klassen.GesamtUmsatz>();
liste = _db.CreateGesamtUmsatzList(tag, monat, jahr, button);
UmsatzGrid.ItemsSource = liste;
 
Hallo,
Exception ist aus dem gezeigten Code nicht abzuleiten. Zudem ist diese Fehlermeldung nicht unbedingt hilfreich. Bitte den StackTrace posten, und bitte künfitg für Code die Codedarstellung verwenden:

Code:
InitializeComponent();             
 Database _db = new Database();


List<UmsatzZahlen.Klassen.GesamtUmsatz> liste = new List<UmsatzZahlen.Klassen.GesamtUmsatz>();
liste = _db.CreateGesamtUmsatzList(tag, monat, jahr, button);
           UmsatzGrid.ItemsSource = liste;

Ist deutlich besser lesbarer.

Danke!

Greetz
hroessler
 
ok, danke für die schnelle antwort:

noch ein zwei hinweise ..

Ich habe das Framework 3.5 ausgewählt weil ich es auf WIn server 2003 , 36Bit lauffähig sein soll...
desswegen gibt es kein Datagrid!!! :! sondern nur Grid..
Kann ich dort überhaupt Observable Collection anwenden?

habe nun eine neu Fehlermeldung:
Fehler:
ERROR [42000][Informix .NET Provider][Informix] A syntax error has occurred.


hier noch mei Xamml vom Grid:
Code:
<UserControl x:Class="UmsatzZahlen.UserControlls.UnterControlls.SelectionsControll"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="570" d:DesignWidth="1400">
    <Grid Height="570" Width="1400">
        <Button Content="Tag" Height="44" HorizontalAlignment="Left" Margin="42,51,0,0" Name="btnTag" VerticalAlignment="Top" Width="106" Click="btnTag_Click" />
        <Button Content="Monat" Height="44" HorizontalAlignment="Left" Margin="185,51,0,0" Name="btnMonat" VerticalAlignment="Top" Width="98" Click="btnMonat_Click" />
        <Button Content="Jahr" Height="44" HorizontalAlignment="Left" Margin="322,51,0,0" Name="btnJahr" VerticalAlignment="Top" Width="94" Click="btnJahr_Click" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="117,109,0,0" Name="comboTag" VerticalAlignment="Top" Width="55" SelectionChanged="comboTag_SelectionChanged" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="117,138,0,0" Name="comboMonat" VerticalAlignment="Top" Width="93" SelectionChanged="comboMonat_SelectionChanged" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="117,167,0,0" Name="comboJahr" VerticalAlignment="Top" Width="120" SelectionChanged="comboJahr_SelectionChanged" />
        <Button Content="Auswertung Starten" Height="23" HorizontalAlignment="Left" Margin="42,251,0,0" Name="btnStart" VerticalAlignment="Top" Width="841" Click="btnStart_Click" />
        <Label Content="Tag    :" Height="28" HorizontalAlignment="Left" Margin="42,104,0,0" Name="lblTag" VerticalAlignment="Top" />
        <Label Content="Monat:" Height="28" HorizontalAlignment="Left" Margin="42,133,0,0" Name="lblMonat" VerticalAlignment="Top" />
        <Label Content="Jahr    :" Height="28" HorizontalAlignment="Left" Margin="42,162,0,0" Name="lblJahr" VerticalAlignment="Top" />
        <Grid DataContext="{Binding}">
            <ListView Name="UmsatzGrid2" ItemsSource="{Binding GesamtUmsatz}" Margin="0,280,0,0">
                <!-->        <IsSynchronizedWithCurrentItem="true">-->
                <ListView.View>
                    <GridView >
                        <GridViewColumn Header="Datum" Width="170" DisplayMemberBinding="{Binding Path=TagesDatum}"/>
                        <GridViewColumn Header="Umsatz" Width="170" DisplayMemberBinding="{Binding Path=Umsatz}"/>
                        <GridViewColumn Header="Gutschriften" Width="170" DisplayMemberBinding="{Binding Path=Gutschrift}"/>
                        <GridViewColumn Header="Gesamtumsatz" Width="180" DisplayMemberBinding="{Binding Path=Gesamtumsatz}"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </Grid>
</UserControl>

hier meine DAtabase klasse.

Code:
public ObservableCollection<GesamtUmsatz> CreateGesamtUmsatzList2(int tag, int monat, string jahr, int button)
       {
           _button = button; // am anfang hier wird _button gesetzt, 1=tages 2=monats 3=jahres - Auswertung
           string EndDatum;
           string NextDatum;  //buchungen.buchungs_zeit
           string TagDatum;   //für alle Auswertungen Database-Variable history.tag
           string TagEndDatum; // für Monats untere Einschränkung
           EndDatum = CreateDateString(tag, monat, jahr);
           NextDatum = CreateEndDateString(tag, monat, jahr);//nur für Tagesauswertung erforderlich                    
           TagDatum = CreateTagString(tag, monat, jahr);
           TagEndDatum = CreateTagEndString(tag, monat, jahr);

           IfxConnection ifx = new IfxConnection(_cs);
           MessageBox.Show("Verbinde zum Server...\nBitte warten!");
         //  List<GesamtUmsatz> liste = new List<GesamtUmsatz>();
           ObservableCollection<GesamtUmsatz> g = new ObservableCollection<GesamtUmsatz>();
          
           try
           {
               ifx.Open();
               MessageBox.Show("Console ist geöffnet...", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
               string sql;
               IfxCommand cmd = null;

               sql =
                "select tag, sum(betrag) *(-1) as Umsatz_ohne_Gutschrift,"+
                "("+
                "select sum(betrag) * 2"+
                "from buchungen"+
                "where verwendungszweck like '%utschrift%'"+
                "AND DATE(buchungs_zeit) = DATE(history.tag)"+
                ")"+
                "FROM history"+
                "where ereignistyp_id = 102"+
                "AND tag >= '"+TagDatum+"'" +
                "AND tag < '"+TagEndDatum+"'" +
                "group by tag"+
                "order by tag";

               cmd = new IfxCommand(sql, ifx);
               MessageBox.Show("kommando verpackt");
//<-- hier diese msgbox kommt noch, dannach exception!
               using (IfxDataReader reader = cmd.ExecuteReader())
               {
                   while (reader.Read())
                   {
                       g.Add(new GesamtUmsatz(reader.GetDateTime(0), reader.GetDecimal(1), reader.GetDecimal(2), null));
                       MessageBox.Show("lese...");
                       //MessageBox.Show(reader.GetString(0) + reader.GetDecimal(1) + reader.GetDecimal(2) + reader.GetDecimal(3));
                   }
               }
               ifx.Close();
               MessageBox.Show("...Console ist geschlossen", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
           }
           catch (SqlException se)
           {
               MessageBox.Show("Sql-Fehler!\n" + se.Message, "SQL-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           catch (ArgumentException ae)
           {
               MessageBox.Show("Fehler:\n" + ae.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           catch (IfxException ie)
           {
               MessageBox.Show("Fehler:\n" + ie.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           catch (Exception e)
           {
               MessageBox.Show("Fehler:\n" + e.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           finally
           {
               MessageBox.Show("Etwas stimmt nicht!\nBitte Programm neu Starten", "Finally-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           return g;
       }


dessweiteren hier meine Umsatz - Klasse:
Code:
namespace UmsatzZahlen.Klassen
{
    public class GesamtUmsatz
    {
        public DateTime TagesDatum { get; set; }
        public decimal? Umsatz { get; set; }
        public decimal? Gutschrift { get; set; }
        public decimal? Gesamtumsatz { get; set; }    

        public GesamtUmsatz(DateTime tagesdatum, decimal? umsatz, decimal? gutschrift, decimal? gesamtumsatz)
        {
            TagesDatum = tagesdatum;
            Umsatz = umsatz;
            Gutschrift = gutschrift;
            Gesamtumsatz = umsatz-gutschrift;          
        }
        public override string ToString()
        {
            return string.Format("{0} {1} {2} {3}", TagesDatum, Umsatz, Gutschrift, Gesamtumsatz); 
        }
    }
}

aus der Abfrage kommt ein Informix Datentyp
Datetime (mm/dd/yyyy),money,money ($4.00)

und hier mein Aufruf:
Code:
public void btnStart_Click(object sender, RoutedEventArgs e)
        {
               
           Database _db = new Database();
           // List<UmsatzZahlen.Klassen.GesamtUmsatz> liste = new List<UmsatzZahlen.Klassen.GesamtUmsatz>();

           ObservableCollection<GesamtUmsatz> g = new ObservableCollection<GesamtUmsatz>();
            _glist = _db.CreateGesamtUmsatzList2(uitag, uimonat, uijahr, uibutton);
            //UmsatzTagWindow dlg = new UmsatzTagWindow(_glist);
            //dlg.Show();
            UmsatzGrid2.ItemsSource = _glist;
          //  dlg.ShowDialog();
        }
 
Zuletzt bearbeitet:
Hallo,
zunächst mal, für den Windows Server 2003 ab SP2 kannst du auch .net 4.0 verwenden. Das Grid in WPF ist eigentlich ein Control um Layouts für Benutzeroberflächen zu definieren, quasi ein Layoutmanager, und ist nicht für die Verwendung als GridView gedacht.

Prüfe bitte mal, ob du .net 4.0 verwenden kannst (Mind. SP2 für Window Server 2003?). Dann ist bei VS2010 in den WPF auch ein DataGridView dabei. Und Poste bitte nicht diesen Wust an Code. Das ist Kontraproduktiv.

Ich bat um den StackTrace der Exception. Darin steht genau, wo im Code der Fehler aufgetreten ist.

Und ja, OberservableCollection<T> kannst natürlich verwenden. Wobei diese Collection nur dann Sinn macht, wenn du deine Applikation mit Hilfe des MVVM Patterns aufbaust.

Greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
sstacktrace:

Code:
bei IBM.Data.Informix.IfxDataReader.GetDecimal(Int32 i)
bei UmsatzZahlen.Datenbank.Database.CreateGesamtUmsatzList2(Int32 tag, Int32 monat, String jahr, Int32 button) in C:\Dokumente und Einstellungen\blablubb\asdft\NEUER\test111\UmsatzZahlen3.15 - Kopie - Kopie\UmsatzZahlen\Klassen\Datenbank.cs:Zeile 147.
bei UmsatzZahlen.UserControlls.UnterControlls.SelectionsControll.btnStart_Click(Object sender, RoutedEventArgs e) in C:\Dokumente und Einstellungen\blablubb\Desktop\asdft\NEUER\test111\UmsatzZahlen3.15 - Kopie - Kopie\UmsatzZahlen\UserControlls\UnterControlls\SelectionsControll.xaml.cs:Zeile 134.
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
bei System.Windows.Controls.Primitives.ButtonBase.OnClick()
bei System.Windows.Controls.Button.OnClick()
bei System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
bei System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
bei System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
bei System.Windows.Input.InputManager.ProcessStagingArea()
bei System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
bei System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
bei System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
bei System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
bei System.Windows.Application.RunDispatcher(Object ignore)
bei System.Windows.Application.RunInternal(Window window)
bei System.Windows.Application.Run(Window window)
bei System.Windows.Application.Run()
bei UmsatzZahlen.App.Main() in C:\Dokumente und Einstellungen\blablubb\Desktop\asdft\NEUER\test111\UmsatzZahlen3.15 - Kopie - Kopie\UmsatzZahlen\obj\x86\Debug\App.g.cs:Zeile 0.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()


money kommt, und decimal wills rein, das ist das problem oder?
welchen daten typ verwende ich da? IfxDecimal vielleicht?
Ergänzung ()

wow danke für den tipp mit dem Framework!!!

ok, nun habe ich den select angepasst, ( leer räume hinzugefügt )und nun bringt er mir eine neue Exception , hier ( stacktrace folgt gleich)
Code:
 using (IfxDataReader reader = cmd.ExecuteReader())
               {
                   while (reader.Read())
                   {
                       DateTime? TagesDatum = (!reader.IsDBNull(0) ? reader.GetDateTime(0) : (DateTime?)null);
                       Decimal? Umsatz = (!reader.IsDBNull(1) ? reader.GetDecimal(1) : (Decimal?)null);
                       Decimal? Gutschrift = (!reader.IsDBNull(2) ? reader.GetDecimal(2) : (Decimal?)null);   
                       g.Add(new GesamtUmsatz(reader.GetDateTime(0), reader.GetDecimal(1), reader.GetDecimal(2)));            //    <------
                   }
               }
               ifx.Close();
 
speedsam schrieb:
sstacktrace:
wow danke für den tipp mit dem Framework!!!
ok, nun habe ich den select angepasst, ( leer räume hinzugefügt )und nun bringt er mir eine neue Exception , hier ( stacktrace folgt gleich)
Code:
using (IfxDataReader reader = cmd.ExecuteReader())
{
  while (reader.Read())
  {
    DateTime? TagesDatum = (!reader.IsDBNull(0) ? reader.GetDateTime(0) : (DateTime?)null);
    Decimal? Umsatz = (!reader.IsDBNull(1) ? reader.GetDecimal(1) : (Decimal?)null);
    Decimal? Gutschrift = (!reader.IsDBNull(2) ? reader.GetDecimal(2) : (Decimal?)null);   
    g.Add(new GesamtUmsatz(reader.GetDateTime(0), reader.GetDecimal(1), reader.GetDecimal(2)));            //    <------
  }
}
ifx.Close();

Hier wirds merkwürdig. Zuerst liest du die Werte in Variablen ein, um dann beim Add doch wieder auf die Methoden zuzugreifen. Ändere das mal wie folgt:

Code:
using (IfxDataReader reader = cmd.ExecuteReader())
{
  while (reader.Read())
  {
    DateTime? TagesDatum = (!reader.IsDBNull(0) ? reader.GetDateTime(0) : (DateTime?)null);
    Decimal? Umsatz = (!reader.IsDBNull(1) ? reader.GetDecimal(1) : (Decimal?)null);
    Decimal? Gutschrift = (!reader.IsDBNull(2) ? reader.GetDecimal(2) : (Decimal?)null);   
    g.Add(new GesamtUmsatz(TagesDatum, Umsatz, Gutschrift));   //    <-- hier die Variablen verwenden
  }
}
ifx.Close();

Ich denke da ist einer der Werte einfach DBNull, was nicht in ein Nullable Decimal oder DateTime konvertiert werden kann. Warum machst du dir erst die Mühe die Werte in Variablen zu speichern um dann doch wieder die GetDateTime und GetDecimal Methoden zu verwenden?

Viel Erfolg
Rossibaer
 
bam danke!!!
... ja habe ich übersehen.

danke!!!


nun zeigt er mir die felder an.. wie kann ich nun spalten hinzufügen, bzw die ausgegebenen spalten berechnen lassen?
z.B das neben
TAgesdatum, Umsatz, Gutschrift, dann noch Umsatz-Gutschrift eine spalte erzeugt wird?


beziehungsweise die spalten formatieren.. dort wird anstelle von 888,00 --> 8880 angezeigt...
 

Ähnliche Themen

Zurück
Oben