2013-07-26 1 views
0

J'ai une page où l'utilisateur peut entrer "de date" et "à ce jour" et obtenir un ensemble de valeurs basées sur la date-intervalle. Le seul problème est qu'il ne fonctionne pas avec le "à ce jour". Lorsque j'entre quelque chose comme ceci: from: 2012-01-01 | to: 2013-07-26 ça marche bien. Mais quand j'essaye quelque chose comme ceci: from: 2010-07-04 | to: 2012-01-01 J'obtiens toujours tous les résultats APRES cette date aussi (comme à partir de 2013).obtenir la mauvaise date pour ma méthode databind

J'ai exécuté un débogage en utilisant les valeurs d'entrée ci-dessus (2010/07/04-2012/01/01). Voici mon code ainsi que les valeurs pertinentes de la mise au point:

ASPX

<asp:TextBox ID="VolumeSearchFromDate" runat="server" CssClass="dateTextBox" /> 
    <br /> 
    <asp:TextBox ID="VolumeSearchToDate" runat="server" CssClass="dateTextBox" /> 
    <br /> 
    <asp:Button ID="Button2" runat="server" Text="Search" onclick="btnVolumeSearch_Click" ValidationGroup="validate" /> 
    <br /> 
    <asp:GridView ID="myGv" runat="server" 
    ShowFooter="True" 
    AutoGenerateColumns="False" AllowSorting="True" DataKeyNames="id" DataSourceID="myObjectDataSource" > 
     <Columns> 
      //my columns here 
     </Columns> 
    </asp:GridView> 

<asp:ObjectDataSource ID="myObjectDataSource" runat="server" 
     DeleteMethod="myDeleteMethod" SelectMethod="mySelectMethod" 
     TypeName="whereItsAt.sqlDataLayer" UpdateMethod="myUpdateMethod"> 
     <DeleteParameters> 
      <asp:Parameter Name="id" Type="Int32" /> 
     </DeleteParameters> 
     <SelectParameters> 
      <asp:Parameter Name="fromDate" Type="DateTime"/> 
      <asp:Parameter Name="toDate" Type="DateTime"/> 
     </SelectParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="id" Type="Int32" /> 
      <asp:Parameter Name="volume" Type="Int32" /> 
     </UpdateParameters> 
    </asp:ObjectDataSource> 

code derrière (C#)

//dont know why this is here. The person who wrote the code 
//in the first place wrote this and I haven't removed it. 
protected void btnVolumeSearch_Click(object sender, EventArgs e) 
{ 
    gvVolumeListBindData(); 
} 

private void gvVolumeListBindData() 
{ 
    myObjectDataSource.SelectParameters.Remove(myObjectDataSource.SelectParameters["fromDate"]); 
    string debugString /* "" */= VolumeSearchFromDate.Text.ToString(); /* 2010-04-07 */ 
    string debugString2 /* 2012-01-01 */ = debugString /* "" */; 
    myObjectDataSource.SelectParameters.Add("fromDate", VolumeSearchFromDate.Text.ToString()); 
    myObjectDataSource.SelectParameters.Remove(myObjectDataSource.SelectParameters["toDate"]); 
    myObjectDataSource.SelectParameters.Add("toDate", VolumeSearchToDate.Text.ToString()); 
    debugString /* "" */ = VolumeSearchToDate.Text.ToString(); /* 2012-01-01 
    debugString2 /* 2012-01-01 */ = debugString; /* "" */ 

    gvVolumeList.DataBind(); 
} 

Méthode pour la récupération des données (également C#)

public static DataTable mySelectMethod(DateTime fromDate /* 2010-07-04 00:00:00 */, DateTime toDate /* 2013-07-26 00:00:00 */) 
{ 
    DateTime minDate = new DateTime(1900,01,01,00,00,00); 
    DateTime maxDate = DateTime.Today; 

    int result = DateTime.Compare(minDate, fromDate); 

    if (result >= 0) 
    { 
     fromDate = minDate; 
    } 

    result = DateTime.Compare(maxDate, toDate); 

    if (result >= 0) 
    { 
     toDate = maxDate; 
    } 

    //set up connection, call stored procedure etc etc etc. 

    return table; 
} 

Alors, est-ce que quelqu'un comprend ce qui se passe ici? Il me semble que mes variables changent aléatoirement des valeurs de temps en temps.

EDIT Le problème était que je vérifiais que si fromDate était trop petit et si toDate était grande, mais je devais vérifier à la fois. Merci à Md. Parvez Alam et Can Canbek de m'avoir aidé à arriver à cette conclusion :)

Répondre

1

changez cette ligne

result = DateTime.Compare(maxDate, toDate); 

à

result = DateTime.Compare(toDate, maxDate); 

passer par ce lien

http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx

+0

Je le pensais aussi, mais quand je le fais, l'instruction if n'est pas entrée et j'obtiens le débordement SqlDateTime.Doit être entre 1/1/1753 12:00:00 AM et 31/12/9999 23:59:59 PM. ' –

+0

obtenez-vous cette erreur sur la deuxième comparaison –

+0

s'il vous plaît essayer comme ceci result = DateTime.Compare (toDate, DateTime.Now); –

1

Ok, allons-y étape par étape;

Vous avez vos valeurs minDate et maxDate qui sont aujourd'hui.

result = DateTime.Compare(maxDate, toDate); 

    if (result >= 0) 
    { 
     toDate = maxDate; 
    } 

Lorsque vous arrivez à cette partie, vous comparez la date d'aujourd'hui avec la variable todate, et depuis la date d'aujourd'hui est après votre valeur toDate il retourne « 1 » et vous assignez la date d'aujourd'hui à la valeur toDate ainsi le retour à la date d'aujourd'hui.

Je pense que si vous changez le code avec cela, il devrait fonctionner

result = DateTime.Compare(maxDate, toDate); 

    if (result < 0) 
    { 
     toDate = maxDate; 
    } 

Donc, si l'entrée est en fait après la date d'aujourd'hui, vous mettez l'entrée dans la date d'aujourd'hui.

+0

Comme je l'ai répondu Md. Parvez Alam, j'ai essayé cela d'abord parce que c'était à quoi cela ressemblait sur MSDN-documentation. Mais quand je le fais comme ça, j'ai cette erreur: 'SqlDateTime overflow. Doit être entre 1/1/1753 12:00:00 AM et 31/12/9999 23:59:59 PM.' car l'instruction If n'est jamais entrée –

+0

alors vous devriez ajouter une instruction else et retourner l'original toDate value –