Announcement

Collapse
No announcement yet.

Die DataTable wird mit .Fill() nicht immer gefüllt.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Die DataTable wird mit .Fill() nicht immer gefüllt.

    Hallo zusammen,

    ich habe schon wieder ein Problem und weiß nicht was ich falsch gemacht habe.

    Ich habe folgenden Code:
    [highlight=c#]db2con.CommandText = SQLcmd.ToString();
    db2con.Fill(ref DB2Table);
    Max = DB2Table.Rows.Count;
    if (Max == 0)
    {
    // gestrichen weil hierfür nicht relevant
    }[/highlight]

    Und manchmal bleibt die DataTable leer obwohl es Sätze gibt die in die DataTable mit dem Fill hätten fließen müssen. Wenn ich einen BreakPoint auf die Zeile mit dem if setze und danach die aktuell auszuführende Zeile wieder auf den Fill setze und das Programm weiterlaufen lasse, dann stehen plötzlich die Sätze in der DataTable obwohl sich sonst nichts geändert hat. Die gelesene Tabelle wird vorher von einer anderen Routine aufgebaut und danach nicht mehr geändert.

    Ich habe angenommen das der Fill das Programm erst weiterlaufen lässt wenn die DataTable gefüllt ist.

    Wie kann ich sicherstellen das der Fill seinen Job auch erledigt hat?

    Gruß Stephan

  • #2
    Zu was für einer Klasse gehört den die Fill Methode?

    Ich kenne keine Klasse mit einer Fill Methode die einen ref Parameter erwartet. Ref impliziert das dort die Datatable erzeugt wird. Der Methodenname Fill aber das dort nur gefüllt wird. Wenn das selbst programmiert ist finde ich das sehr unglücklich.

    Comment


    • #3
      Sorry, ich habe nicht erwähnt das ich eine eigene Klasse erstellt habe in der ich das ganze gekapselt habe, deswegen hängt der Fill im Beispiel oben an meiner Connection. Ich versuche beim nächsten Mal daran zu denken solche Sachen zu erwähnen.

      Der .Fill gehört in diesem Fall zum DB2DataAdapter (using IBM.Data.DB2; ), aber der SQLDataAdapter (using System.Data.SqlClient; ) hat ebenfalls eine entsprechende Variante der Fill Methode.

      Gruß Stephan

      Comment


      • #4
        Und du fragst nach einem Fehler der im Zusammenhang mit dieser selbstgeschriebenen Fill Methode steht? Dann solltest du uns auch zeigen was in der Methode passiert.

        Comment


        • #5
          Hallo zusammen,

          hier mal meine Klasse:

          [highlight=c#]public class DB2Conn
          {
          #region Variablen

          private String Username;
          private String Password;
          private String Database;
          private DB2Connection _Conn;
          private DB2Command _Com;
          private DB2DataAdapter _Adp;
          private BackgroundWorker _Bgw;

          #endregion

          #region Eigenschaften

          public string ConnectionString
          {
          get { return _Conn.ConnectionString; }
          }

          public string CommandText
          {
          get { return _Com.CommandText; }
          set { _Com.CommandText = value; }
          }

          public bool IsBusy
          {
          get { return _Bgw.IsBusy; }
          }

          public System.Data.ConnectionState State
          {
          get { return _Com.Connection.State; }
          }
          #endregion

          #region Konstruktoren

          public DB2Conn(string myDatabase, string myUsername, string myPassword)
          {
          try
          {
          this.Database = myDatabase;
          this.Username = myUsername;
          this.Password = myPassword;

          // Check to make sure that our class was passed information
          // from the caller before we attempt to connect
          if (String.IsNullOrEmpty(Username))
          throw new InvalidDataException("No Username Specified");
          if (String.IsNullOrEmpty(Password))
          throw new InvalidDataException("No Password Specified");
          if (String.IsNullOrEmpty(Database))
          throw new InvalidDataException("No Database Specified");

          _Bgw = new BackgroundWorker();
          _Bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgWr k_ENQ);
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }
          #endregion

          #region Methoden

          public event FillErrorEventHandler FillError;

          public void Open()
          {
          try
          {
          // Connection string
          string ConnString = String.Format("Database={0};UID={1};PWD={2};",
          this.Database, this.Username, this.Password);
          if (_Conn != null)
          _Conn.Close();

          // Initialise the connection
          _Conn = new DB2Connection(ConnString);
          // Open the connection

          _Conn.Open();
          _Com = new DB2Command();
          _Com.Connection = _Conn;
          _Com.CommandTimeout = 2000;
          _Adp = new DB2DataAdapter();
          _Adp.SelectCommand = _Com;
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }

          public void Close()
          {
          _Conn.Close();
          }

          public void Dispose()
          {
          _Conn.Dispose();
          }

          public void Fill(ref DataTable dtatbl)
          {
          try
          {
          _Adp.Fill(dtatbl);
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }

          public void PrepareReader(ref DB2DataReader dtardr)
          {
          try
          {
          dtardr = _Com.ExecuteReader();
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }

          public Int32 ExecuteNonQuery()
          {
          try
          {
          return _Com.ExecuteNonQuery();
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }

          public void ExecuteNonQueryAsync()
          {
          _Bgw.RunWorkerAsync();
          }

          private void bgWrk_ENQ(object sender, DoWorkEventArgs e)
          {
          try
          {
          _Com.ExecuteNonQuery();
          }
          catch (Exception Ex)
          {
          // Fehlermeldung nach draußen weiterleiten, im Moment will ich hier selbst keine Fehler verarbeiten.
          throw new SystemException("", Ex);
          }
          }

          #endregion
          }
          [/highlight]

          gerufen wird das Ganze dann so:

          [highlight=c#]DB2Conn conn = new DB2Conn(DB2Server, DB2User, DB2Pwd);
          try
          {
          conn.Open();
          }
          catch(Exception Ex)
          {
          return 1;
          }
          DataTable DB2Table = new DataTable();
          StringBuilder JobCommand = new StringBuilder("");
          JobCommand.Append("SELECT FINR, KDNR, SAIS, SAI7, SGMT, KOLL, KURS, WAEH FROM DISPO ");
          conn.CommandText = JobCommand.ToString();
          conn.Fill(ref DB2Table);
          [/highlight]

          Gruß Stephan

          Comment

          Working...
          X