Laden...

Reader liefert nur einen Datensatz zurück

Erstellt von tom-cat vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.709 Views
T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren
Reader liefert nur einen Datensatz zurück

Guten morgen zusammen,

in meinem Script liefert die Abfrage nur einen Datensatz zurück, obwohl mehrere Datensätze in der Datenbank enthalten sind.

Hat da jemand eine Idee warum ?

 protected void Page_Load(object sender, EventArgs e)
        {
            //PanelShowGrid.Visible = false;
           
            // Supplierer laden
            int CompID = (int)(Session["CompID"]);
            string conString;

            if (Page.IsPostBack)
            {
                //Label3.Text = "You have selected " + DDLSupplier.SelectedItem.Value;
                int _DDLItem = Convert.ToInt32(DDLSupplier.SelectedItem.Value);
            

              try
                {
                    data.DataClassesConnectionStringsDataContext db = new data.DataClassesConnectionStringsDataContext();
                    var con = from c in db.ApplSettings
                              where c.companyID == CompID
                              select c;

                    foreach (var conns in con)
                    {
                        //Label1.Text = conns.constring;
                        conString = conns.constring;

                        string strSQLconnection = conString;
                        SqlConnection sqlConnection = new SqlConnection(strSQLconnection);
                        SqlCommand sqlCommand = new SqlCommand("SELECT ForeignInvoiceID,InvoiceNumber,SupplierName,InvoiceDate,GrossAmount FROM Asmbl_Invoice where StandardSupplierID = '" + _DDLItem + "'", sqlConnection);
                        sqlConnection.Open();
                        SqlDataReader reader = sqlCommand.ExecuteReader();

                        while (reader.Read())
                           
                        {

                            int _ForeignInvoiceID = reader.GetInt32(0);
                            string _InvoiceID = reader.GetString(1);
                            string _Supplier = reader.GetString(2);
                            DateTime _Date = reader.GetDateTime(3);
                            //float _GrossMount = reader.GetFloat(4);

                            lbInoviceNumber.Text = _InvoiceID;
                            lbSupplier.Text = _Supplier;
                            lbDate.Text = Convert.ToString(_Date);
                            //lbGrossMount.Text = Convert.ToString(_GrossMount);

                            // Jetzt hier die daten auslesen für die URL

                            try
                            {
                                string conStr = ConfigurationManager.ConnectionStrings["aequitixx_InvoiceScansConnectionString"].ConnectionString;
                                string _URL = "";
                                SqlConnection objCon = new SqlConnection(conStr);
                                string sqlBefehl = "Proc_GetImageViewerURLhttps";

                                SqlCommand objCommand = new SqlCommand(sqlBefehl, objCon);
                                objCommand.CommandType = CommandType.StoredProcedure;
                                SqlParameter meinParam = objCommand.Parameters.Add(new SqlParameter("@ForeignInvoiceID", SqlDbType.VarChar, 50));
                                meinParam.Direction = ParameterDirection.Input;
                                meinParam.Value = _ForeignInvoiceID;
                                SqlDataAdapter objAdapter = new SqlDataAdapter();
                                objAdapter.SelectCommand = objCommand;

                                objCon.Open();
                                _URL = objCommand.ExecuteScalar().ToString();

                                PDFAnzeigen.Attributes["href"] = _URL;
                                PDFAnzeigen.Attributes["class"] = "bumpbox";
                                objCon.Close();
                                objCon = null;
                                
                            }
                            catch (Exception e2)
                            {
                                Label1.Text = "Fehler :" + e2;
                            }
                                                                                  
                        
                        }
                        reader.Close();
                                      
                    } 
              }
                
                catch (Exception e1)
                {
                    Label1.Text = "Fehler bei der Abfrage:" + e1;
                }
                     
           }
            
            try
            {
                data.DataClassesConnectionStringsDataContext db = new data.DataClassesConnectionStringsDataContext();
                var con = from c in db.ApplSettings
                          where c.companyID == CompID
                          select c;

                foreach (var conns in con)
                {
                    //Label1.Text = conns.constring;
                    conString = conns.constring;

                    string strSQLconnection = conString;
                    SqlConnection sqlConnection = new SqlConnection(strSQLconnection);
                    SqlCommand sqlCommand = new SqlCommand("SELECT DISTINCT SupplierName, StandardSupplierID FROM Asmbl_Invoice", sqlConnection);
                    sqlConnection.Open();
                    SqlDataReader reader = sqlCommand.ExecuteReader();
                                        
                    DDLSupplier.DataTextField = "SupplierName";
                    DDLSupplier.DataValueField = "StandardSupplierID";
                    DDLSupplier.DataSource = reader;
                    DDLSupplier.DataBind();
                    DDLSupplier.Items.Insert(0, "-- Lieferant wählen --");
                                       
                
                }

            }
            catch (Exception e1)
            {
                Label1.Text = "Fehler bei der Abfrage:" + e1;
            }

        }
S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

bist du dir sicher, das mehrere Datensätze bei deiner Abfrage zurückkommen?
Hast du das überprüft, zB mit dem ManagementStudio?

mfg
serial

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Jep die Abfrage läuft sauber im Management Studio !
Dort bekomme ich, wenn vorhanden, mehrere Datensätze zurückgeliefert !

S
902 Beiträge seit 2007
vor 13 Jahren

Bekommst du vielleicht eine Exception?
Möglicherweise kann ein Wertz aus der DB nicht umgewandelt werden, oder ist DBNull?

mfg
serial

[Edit] weiterhin lege ich dir nahe, parameter zu verwenden, statt den Sql-Seelct händisch per string zusammenzufriemeln.

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Das ist es ja, ich bekomme keine Fehler !
Ich bekomme nur sauber einen Datensatz angezeigt, mehr nicht. Obwohl mit der gleichen Abfrage in Management Studio mehrere Angezeigt werden.
Ich vermute schon die Schleife, das die zu früh zu macht, aber ich peil gerade nicht wodran es liegen könnte.

Wie gesagt keine Fehler, oder Ausnahmen.

458 Beiträge seit 2007
vor 13 Jahren
  
_URL = objCommand.ExecuteScalar().ToString();  
  

SqlCommand.ExecuteScalar-Methode
Führt die Abfrage aus und gibt die erste Spalte der ersten Zeile im Resultset zurück, das durch die Abfrage zurückgegeben wird. Zusätzliche Spalten oder Zeilen werden ignoriert.

be the hammer, not the nail!

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Ok super danke das ist einleutend

Wie kann ich jedoch die Abfrage dann so hinbekommen, das es funktioniert ??? 😦

S
902 Beiträge seit 2007
vor 13 Jahren

Ach, um welche geht es denn?
Ich dachte es geht um den Reader, der richtig mit ExecuteReader gestartet wird.
Oder geht es um das innere Scalar?

mfg
serial

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Es geht allgemein darum, warum mir nur 1 Datensatz angezeigt wird, wo ich mehrere Datensätze auslese.
Logische erklärung von aequitas war, das ich zwar alle Datensätze einlese, jedoch bei der nächsten Abfrage, innerhalb der 1. Abfrage, meine Daten mit einerm PROC nochmal anreichere, um die _URL.
Dort wird mir nur ein Datensatz zurückgeliefert - was ja auch korrekt ist - jedoch bricht er dann ab, weil er ja einen Datensatz geliefert hat.

Ich muss aber alle Datensätze quasi durchgehen, die vorhanden sind anhand der Abfrage und diese mit der PROC => _URL anreichern !

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

ich wüsste nciht wieso der Reader dann abbrechen sollte.
Du benutzt ja eigene Objete (Connection etc) für die 2te abfrage.

Vielleicht wird die Connection geschlossen, aber auch das kann ich mir nicht vorstellen.

Ich muss dazu sagen, ich habe schon lang nicht mehr mit ADO.net selbst sowas gemacht.

mfg
serial

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Stimmt die Verbindungen bleiben offen bez. werden in der Abfrage sauber geschlossen.
hmm.... Ich weiss nicht mehr weiter 😦((

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

selbst wenn ich die "zwischen Abfrage" ausklammer, und dann debuge, bekomme ich auch nur einen Datensatz angezeigt.
Also müsste es ein Problem mit dem reader der "1. Abfrage" zusammenhängen.

S
902 Beiträge seit 2007
vor 13 Jahren

Vielleicht testest du mal MARS

mfg
serial

S
902 Beiträge seit 2007
vor 13 Jahren

... bekomme ich auch nur einen Datensatz angezeigt.

naja, angezeiegt auf deiner page wirst du auch immer nur einen bekommen, nämlich den letzten.

Du schreibst ja immer in die selben Controls, überschreibst ale jedesmal dein ergebnis.

[Edit] geht es dir eigentlich wirklich um den ersten DataReader, oder um den 2ten, für die DDLSupplier?

mfg
serial

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

den 2. Sorry.
Dort wo ich die Rechnungen anhand des DDLSupplier auslese.
genaugenommen das hier :

 SqlCommand sqlCommand = new SqlCommand("SELECT ForeignInvoiceID,InvoiceNumber,SupplierName,InvoiceDate,GrossAmount FROM Asmbl_Invoice where StandardSupplierID = '" + _DDLItem + "'", sqlConnection);
S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

du bindest also den Reader als DataSource?

Versuch es mal über die DefualtView einer DataTable.

Pseudocode


DataTable dt = new DataTable();
dt.Load(myDataReader);
DataSource = dt.DefaultView;

mfg
serial

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Die Darstellung der Abfrage ziehe ich mir in die Labels

 <asp:Panel ID="Panel1" runat="server">
        <table cellpadding="0" cellspacing="0" style="width: 738px">
            <tr>
                <td style="width: 24px">
                    &nbsp;</td>
                <td style="width: 123px">
                    <b>Rechnungsnummer</b></td>
                <td style="width: 105px">
                    <strong>Datum</strong></td>
                <td style="width: 149px">
                    <b>Lieferant</b></td>
                <td style="width: 105px">
                    <b>Betrag</b></td>
                <td style="width: 232px">
                    <b>Organisation</b></td>
            </tr>
            <tr>
                <td style="width: 24px">
                    <center>
                        <asp:HyperLink ID="PDFAnzeigen" runat="server" 
                           ImageUrl="~/images/pdf_icon_16.gif">öffnen</asp:HyperLink>
                    </center>
                </td>
                <td style="width: 123px">
                    <asp:Label ID="lbInoviceNumber" runat="server"></asp:Label>
                </td>
                <td style="width: 105px">
                    <asp:Label ID="lbDate" runat="server"></asp:Label>
                </td>
                <td style="width: 149px">
                    <asp:Label ID="lbSupplier" runat="server"></asp:Label>
                </td>
                <td style="width: 105px">
                    <asp:Label ID="lbGrossMount" runat="server"></asp:Label>
                </td>
                <td style="width: 232px">
                    <asp:Label ID="lbOrgName" runat="server"></asp:Label>
                </td>
            </tr>
        </table>
    </asp:Panel>

Das noch als kleiner Hinweis, da ich sonst nicht mit der PROC des _URL im Link befüllen kann.

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

hast Du das überlesen?

naja, angezeiegt auf deiner page wirst du auch immer nur einen bekommen, nämlich den letzten.

Du schreibst ja immer in die selben Controls, überschreibst ale jedesmal dein ergebnis.

Ich halte das für einen echten Grund.
Es gibt ja nur eine Zeile in Deiner Tabelle, und die wird in der Schleife immer neu befüllt statt neue Zeilen zu erstellen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

Hi,

okay sorry das hatte ich wirklich übersehen.
Gut ich kann das mit DataTable machen, jedoch kann ich dann ja nicht die _URL auf den Hyperlink schreiben ?!