Avatar billede sbaht Nybegynder
26. april 2006 - 08:53 Der er 58 kommentarer og
1 løsning

Søgning i et dato range.

Jeg har lavet en søgefunktion hvor der kan søges imellem to datoer, den virker sådan set, men når man ønsker at søge over to måneder f.eks. 10-03-2006 til 20-04-2006 virker det ikke.

koden ser således ud:

private void Button1_Click(object sender, System.EventArgs e)
        {
            if (!(IsPostBack))
            {
            return;
            }
            DateTime Start = DateTime.Parse(txtStart.Text);
            DateTime Slut = DateTime.Parse(txtSlut.Text);

            string strConnection;                       
            string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND Date BETWEEN '"+Start+ "' AND '" +Slut+"' ORDER BY Dato, Time ASC";
           
            strConnection = "user id=Rensningslog_Webuser;password=xxxxx;";
            strConnection += "initial catalog=log;server= sqlNY;";
            strConnection += "Connect Timeout=30";

            SqlConnection conn = new SqlConnection( strConnection );
            SqlCommand cmd = new SqlCommand( Sql, conn );
            cmd.Parameters.Add( new SqlParameter( "@Kontrol", DropDownList1.SelectedValue ));
                       
            DataSet ds = new DataSet();
            SqlDataAdapter adpt = new SqlDataAdapter( cmd );
            cmd.Connection.Open();

            try
            {
                adpt.Fill( ds );
            }
            finally
            {
                cmd.Connection.Close();
            }

            DataGrid1.DataSource = ds;
            DataGrid1.DataBind();
        }
Avatar billede dr_chaos Nybegynder
26. april 2006 - 09:13 #1
prøv lige at udskrive start og slut date for at se om de er sat korrekt op.
Avatar billede sbaht Nybegynder
26. april 2006 - 09:31 #2
Er ikke helt med på hvad du mener?
Avatar billede dr_chaos Nybegynder
26. april 2006 - 09:38 #3
Response.Write(Start.Day.ToString() +","+ Start.Month.ToString() +","+Start.Year.ToString());
og
Response.Write(Slut.Day.ToString() +","+ Slut.Month.ToString() +","+Slut.Year.ToString());

For at se om de 2 datoer indeholder hvad du forventer ?
Hvordan ser datoformatet ud i databasen ?
Avatar billede sbaht Nybegynder
26. april 2006 - 09:55 #4
Dato formatet i databasen ser således ud eks. 01-04-2006.
Avatar billede sbaht Nybegynder
26. april 2006 - 09:58 #5
det bliver skrevet ud sådan: 1,4,200627,4,2006
Avatar billede sbaht Nybegynder
26. april 2006 - 09:59 #6
Hvis jeg søger fra 01-04-2006 til 27.04.2006
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:02 #7
hvad med:
10-03-2006 til 20-04-2006 ?
Avatar billede sbaht Nybegynder
26. april 2006 - 10:06 #8
der skrives ligeledes 10,3,200620,4,2006, men der skrives intet ud i datagridet.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:11 #9
Kommer der noget i datagridet på noget tidspunkt ?

prøv lige at udskrive:
Response.Write(SqlCommand.CommandText);
lige før du åbner connection til databasen.
Avatar billede sbaht Nybegynder
26. april 2006 - 10:21 #10
Jo der kommer noget ud men der mangler en del data.

Hvis jeg skriver Response.Write(SqlCommand.CommandText); Får jeg en compileringsfejl:

An object reference is required for the nonstatic field, method, or property 'System.Data.SqlClient.SqlCommand.CommandText'
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:22 #11
sorry skulle være cmd.CommandText
Avatar billede sbaht Nybegynder
26. april 2006 - 10:25 #12
Ok så udskrives:

SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND Date BETWEEN '10-03-2006 00:00:00' AND '27-04-2006 00:00:00' ORDER BY Dato, Time ASC
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:31 #13
prøv lige at udskrive
cmd.Parameters[0].Value
Avatar billede sbaht Nybegynder
26. april 2006 - 10:34 #14
Så udskrives det første felt i tabellen.
Avatar billede sbaht Nybegynder
26. april 2006 - 10:39 #15
Datofeltet i tabellen er ikke af DataType "DateTime" men "Char", kan det være det der laver ballade??
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:45 #16
i den grad vender lige tilbage om 2 sec
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:49 #17
prøv med

CONVERT(DATETIME,'10-03-2006',105)
  string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND CONVERT(DATETIME,Dato,105)BETWEEN '"+Start+ "' AND '" +Slut+"' ORDER BY CONVERT(DATETIME,Dato,105), Time ASC";
Avatar billede dr_chaos Nybegynder
26. april 2006 - 10:50 #18
hov glem CONVERT(DATETIME,'10-03-2006',105) var bare en test
Avatar billede sbaht Nybegynder
26. april 2006 - 11:15 #19
Jeg får følgende fejl:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace:


[SqlException: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.]
  System.Data.SqlClient.SqlDataReader.Read() +176
  System.Data.Common.DbDataAdapter.FillLoadDataRow(SchemaMapping mapping) +175
  System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) +260
  System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) +129
  System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +304
  System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +77
  System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +38
  Rensningslog.WebForm3.Button1_Click(Object sender, EventArgs e) in \\nzdev\rensningslog\soeg_dato.aspx.cs:154
  System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
  System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +58
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
  System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
  System.Web.UI.Page.ProcessRequestMain() +1292
Avatar billede dr_chaos Nybegynder
26. april 2006 - 11:21 #20
prøv lige med
string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND CONVERT(DATETIME,Dato,105)BETWEEN '"+Start+ "' AND '" +Slut+"'";

Hedder feltet Date eller Dato ?
Avatar billede sbaht Nybegynder
26. april 2006 - 11:25 #21
Feltet hedder Date..
Avatar billede sbaht Nybegynder
26. april 2006 - 11:28 #22
Det giver samme fejl.

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 11:32 #23
string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND CONVERT(DATETIME,Date,105)BETWEEN '"+Start+ "' AND '" +Slut+"'";
Avatar billede sbaht Nybegynder
26. april 2006 - 11:35 #24
Det er det samme :-(
Avatar billede dr_chaos Nybegynder
26. april 2006 - 11:41 #25
er der nogen af felterne som er tomme ?
prøv ind i queryanalyzer at afvikle

SELECT top 20 CONVERT(DATETIME,Date,105) FROM dbo.Data
Avatar billede sbaht Nybegynder
26. april 2006 - 12:03 #26
Nej der er ikke nogen tomme felter.
Ovenstående kræver nok lige en forklaring, hvor går jeg ind i queryanalyzer??
Avatar billede dr_chaos Nybegynder
26. april 2006 - 12:23 #27
Er det en sql database du bruger og benytter du enterprise manager ?
Avatar billede sbaht Nybegynder
26. april 2006 - 12:26 #28
Ja det er en sql database, men jeg har ikke enterprise manager installeret.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:08 #29
Avatar billede sbaht Nybegynder
26. april 2006 - 13:08 #30
Det er som om at der kun kigges på de to første ciffer i datoen, når der søges fra 10-04-2006 til 25-04-2006, kommer de rigtige records med, men dem fra den foregående måned kommer også med. eks. 10-03-2006 til 25-03-2006.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:11 #31
det er klart du forsøger at bruge en dato mod et char felt.
Lav feltet om til en datetime.
Så har du ikke de problemer.
Avatar billede sbaht Nybegynder
26. april 2006 - 13:16 #32
Jeg har ændret feltet til DateTime men får så den samme fejl som jeg fik før:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:18 #33
prøv med:
string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND Date BETWEEN '"+Start+ "' AND '" +Slut+"' ORDER BY Date , Time ASC";
Avatar billede sbaht Nybegynder
26. april 2006 - 13:42 #34
Det virker stadig ikke, hvis jeg benytter det feltet med DataType "DateTime" får den samme fejl:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Hvis jeg benytter feltet med DataType "Char" kan den ikke sorterer tabellen.
Kan man benytte en anden måde at søge på??
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:44 #35
prøv lige at lave feltet  om til en smalldatetime.
Avatar billede sbaht Nybegynder
26. april 2006 - 13:44 #36
Kan det være måden at jeg logger datoen på når jeg gemmer i tabellen??
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:44 #37
hvordan kan du få "The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value." når du ikke laver en conversion ?
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:45 #38
burde det ikke være.
Avatar billede sbaht Nybegynder
26. april 2006 - 13:47 #39
ok, det giver bare den samme fejl:

The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.
Avatar billede dr_chaos Nybegynder
26. april 2006 - 13:48 #40
prøv med
string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND Date BETWEEN "+Start+ " AND " +Slut+" ORDER BY Date , Time ASC";
Avatar billede sbaht Nybegynder
26. april 2006 - 13:57 #41
Det virker ikke der kommer fejl fordi '' mangler omkring "+Start+". Har det nogen betydning at jeg manuelt har ændret på datoerne i tabellen?
Avatar billede sbaht Nybegynder
26. april 2006 - 14:37 #42
Kan man lave koden anderledes??
Avatar billede dr_chaos Nybegynder
28. april 2006 - 08:06 #43
når du ændre fra varchar til datofelt i databasen hvordan ser værdierne i felterne så ud ?
Avatar billede sbaht Nybegynder
01. maj 2006 - 08:41 #44
Værdierne ser rigtige nok ud: 29-04-2006 14:47:00.
Avatar billede dr_chaos Nybegynder
01. maj 2006 - 09:15 #45
prøv lige med
string Sql = "SELECT * FROM dbo.Data WHERE Date BETWEEN >= '"+Start+ "'";
Avatar billede sbaht Nybegynder
01. maj 2006 - 10:31 #46
Det giver samme fejl:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Avatar billede sbaht Nybegynder
01. maj 2006 - 13:52 #47
Kan måden jeg indsætter data i tabellen på gøre en forskel? Jeg indsætter på følgende måde:

private void Gem_Log_Click(object sender, System.EventArgs e)
        {
            DateTime datNow = DateTime.Now;
            //lblTime.Text = "" + datNow.ToString("H:mm:ss");
            //lblDate.Text = DateTime.Now.ToString("dd-MM-yy");
            string strSQL;
            DataSet objDataSet = new DataSet();
            SqlConnection objConnection = null;
            SqlDataAdapter objAdapter = null;

            string strConnection = "user id=Webuser;password=;xxxxxx";
            strConnection += "initial catalog=log;server= sqlNY;";
            strConnection += "Connect Timeout=30";   
       
            strSQL = "SELECT Kontrol, Initialer, Hold, Tilkald, Logtype, Overlevering, Opstart, Flow, Tid, Kommentarer, Dato, Date FROM dbo.Data;";
           
            objConnection = new SqlConnection(strConnection);
            objAdapter = new SqlDataAdapter(strSQL, objConnection);
   
            objAdapter.Fill(objDataSet, "Data");
   
            DataTable objTable = null;
            DataRow objnewRow = null;
            objTable = objDataSet.Tables["Data"];
            objnewRow = objTable.NewRow();
            objnewRow["Kontrol"] = DropDownList1.SelectedItem.Value;
            objnewRow["Hold"]=DropDownList3.SelectedItem.Value;
            objnewRow["Initialer"]=Initialer.Text;
            objnewRow["Tilkald"] = DropDownList4.SelectedItem.Value;
            objnewRow["Logtype"] = Log_Type.SelectedItem.Value;
            objnewRow["Overlevering"]=DropDownList5.SelectedItem.Value;
            objnewRow["Opstart"] = DropDownList7.SelectedItem.Value;
            objnewRow["Flow"] = DropDownList8.SelectedItem.Value;
            objnewRow["Kommentarer"] = Kommentarer.Text;
            //objnewRow["Time"] = lblTime.Text;
            objnewRow["Date"] = DateTime.Now.ToString("yyMMdd");
            objnewRow["Dato"] = DateTime.Now;

            if ( DropDownList9.Enabled )
            {
                objnewRow["Tid"] = DropDownList9.SelectedItem.Value;
            }
            else if ( DropDownList10.Enabled )
            {
                objnewRow["Tid"] = DropDownList10.SelectedItem.Value;
            }
            else if ( DropDownList11.Enabled )
            {
                objnewRow["Tid"] = DropDownList11.SelectedItem.Value;
            }
            else if ( DropDownList12.Enabled )
            {
                objnewRow["Tid"] = DropDownList12.SelectedItem.Value;
            }
            objTable.Rows.Add(objnewRow);
   
            SqlCommandBuilder objBuilder = null;
            objBuilder = new SqlCommandBuilder( objAdapter );           
            objAdapter.InsertCommand = objBuilder.GetInsertCommand();   

            objAdapter.Update( objDataSet, "Data" );
Avatar billede tuxic Nybegynder
01. maj 2006 - 13:58 #48
Hvorfor bruger du ikke et DateTime felt til Date? Det er på alle måder det letteste.

Hvorfor har du både et Date og Dato felter der indeholder nærmest det samme? (Givet Dato kan du altid finde Date).
Avatar billede dr_chaos Nybegynder
01. maj 2006 - 13:59 #49
string Sql = "SELECT * FROM dbo.Data WHERE Date BETWEEN >= '"+Start.ToString("yyMMdd")+ "'";
eller
string Sql = "SELECT * FROM dbo.Data WHERE Dato BETWEEN >= '"+Start+ "'";
Avatar billede tuxic Nybegynder
01. maj 2006 - 14:02 #50
Anyway når du skriver datetime'en som yyMMdd skal du jo også konvertere den tilbage til datetime sådan. Dvs i stedet for at skrive
CONVERT(DATETIME,Date,105)

skal du snarere skrive
CONVERT(DATETIME,Date,12)
Avatar billede sbaht Nybegynder
01. maj 2006 - 14:25 #51
Grunden til at jeg både har Date og Dato er at jeg ikke kan få det til og virke og har derfor valgt at bruge en streng til at sortere og søge datoerne efter(hvilket virker), det vil ville bare være ganske rart at få det til at virke korrekt.
Avatar billede dr_chaos Nybegynder
02. maj 2006 - 08:00 #52
hvordan ser dato formatet ud i date tabellen ?
Avatar billede dr_chaos Nybegynder
02. maj 2006 - 08:00 #53
date feltet even
Avatar billede sbaht Nybegynder
02. maj 2006 - 08:57 #54
Det ser sådan ud 01-05-2006 22:40:00
Avatar billede dr_chaos Nybegynder
02. maj 2006 - 18:39 #55
prøv lige med
  DateTime Start = DateTime.Parse(txtStart.Text);
        DateTime Slut = DateTime.Parse(txtSlut.Text);

        string strConnection;
        string Sql = "SELECT * FROM dbo.Data WHERE Kontrol=@Kontrol AND Dato BETWEEN @Start AND @Slut ORDER BY Dato, Time ASC";

        strConnection = "user id=Rensningslog_Webuser;password=xxxxx;";
        strConnection += "initial catalog=log;server= sqlNY;";
        strConnection += "Connect Timeout=30";

        SqlConnection conn = new SqlConnection(strConnection);
        SqlCommand cmd = new SqlCommand(Sql, conn);
        cmd.Parameters.Add(new SqlParameter("@Kontrol", SqlDbType.VarChar,50));
        cmd.Parameters.Add(new SqlParameter("@Start", SqlDbType.DateTime));
        cmd.Parameters.Add(new SqlParameter("@Slut", SqlDbType.DateTime));

        cmd.Parameters[0].Value = DropDownList1.SelectedValue;
        cmd.Parameters[1].Value = Start;
        cmd.Parameters[2].Value = Slut;
Avatar billede sbaht Nybegynder
03. maj 2006 - 12:52 #56
Ovenstående fungere helt fint, så det er vidst på tide at få afsluttet dette. Et hurtigt tillægsspørgsmål: Hvordan får jeg ovenstående kode til at kigge et døgn tilbage? Der skal ikke skrives nogen dato, der skal når der trykkes på knappen trækkes data som er registreret det sidste døgn.
Avatar billede dr_chaos Nybegynder
03. maj 2006 - 12:57 #57
du ændre f.eks. start dato til
Start = Start.AddDays(-1);
og svar :)
Avatar billede sbaht Nybegynder
03. maj 2006 - 13:03 #58
Kanont!!! Jeg kigger på sagerne, ved godt at det egentlig skulle være et nyt spm.
Avatar billede dr_chaos Nybegynder
03. maj 2006 - 13:09 #59
Det går nok :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester