Avatar billede mema Nybegynder
23. januar 2009 - 13:38 Der er 8 kommentarer og
1 løsning

Converting Text til datatime

I en sql server 2005 database, har jeg en kolonne af typen datetime. Jeg vil foretager en søgning og visning af nogle felter af tabellen, hvor datoen skal være 1 måned før og efter en bestemt dato, der indtastes i webformen i en textbox. Jeg har prøvet med nedenstående men får denne fejl:
System.Data.SqlClient.SqlException: Conversion failed when converting datetime from character string......

Codebehind:
-----------
private void BindGrid()
{
dg.DataSource = GetData();
dg.DataBind();
}

private DataTable GetData()
{
string strCmd = "";
SqlConnection conSoeg = new SqlConnection(WebConfigurationManager.ConnectionStrings["MemberConnectionString"].ConnectionString);
if (!txtNavn.Equals(""))
{
strCmd = "Tabel1.Regnr, Tabel1.Navn, Tabel2.Adresse FROM Tabel1 inner join Tabel2 ON Tabel1.Regnr=Tabel2.Regnr " +
"WHERE Tabel1.Dato Between 'lblDato1.Text' AND 'lblDato2.Text'";
}
try
{
conSoeg.Open();
SqlDataAdapter oCMD = new SqlDataAdapter(strCmd, conSoeg);
DataSet oDS = new DataSet();
oCMD.Fill(oDS);
DataTable dt = oDS.Tables[0];
return dt;
}
finally
{
conSoeg.Close();
}
}

protected void btnSoeg_Click(object sender, EventArgs e)
{
try
{
BindGrid();
}
}
catch (Exception ex)
{
lblFejl.Text = ex.ToString();
}
}

protected void txtNavn_TextChanged(object sender, EventArgs e)
{
lblDato1.Text = Convert.ToDateTime(txtDato.Text).AddMonths(-1).ToShortDateString();
lblDato2.Text = Convert.ToDateTime(txtDato.Text).AddMonths(1).ToShortDateString();
}
-----------
Avatar billede aaberg Nybegynder
23. januar 2009 - 13:57 #1
Brug SqlParameter klassen for at parse parametre til SQL Serveren, i stedet for bare at putte det ind i en string. Konvertere indholdet af dine tekstbokse til en DateTime før du parser dem ind i en parameter. Så slipper du alt sådan noget bøvl.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx
Avatar billede aaberg Nybegynder
23. januar 2009 - 13:58 #2
Bare sig til, hvis du har problemer med at få det til, så skal jeg give dig lidt eksempelkode. Man lærer bare ofte bedre ved selv at finde ud af tingene.
Avatar billede mema Nybegynder
23. januar 2009 - 19:30 #3
Tak for svaret. Jeg har prøvet at finde ud af hvordan skal jeg bruge parameters her, men... Kan du ikke komme med lidt vejledende koder?
Avatar billede arne_v Ekspert
24. januar 2009 - 02:47 #4
http://www.eksperten.dk/artikler/831 har et eksempel med brug af parameter og DateTime.
Avatar billede arne_v Ekspert
24. januar 2009 - 02:48 #5
Men grundliggende er det:

strCmd = "Tabel1.Regnr, Tabel1.Navn, Tabel2.Adresse FROM Tabel1 inner join Tabel2 ON Tabel1.Regnr=Tabel2.Regnr WHERE Tabel1.Dato Between @d1 AND @d2";

så skal du sætte de 2 parametre @d1 og @d2.
Avatar billede mema Nybegynder
24. januar 2009 - 16:18 #6
Jeg kan stadigvæk ikke trække 3 kolonner fra databasen, hvor den tredje kolonne er af typen DateTime og værdien skal læses fra 2 teksbokse i webformen (skal vise poster, hvor datoen ligger mellem disse 2 tekstboks values) og vise den i en datagrid:(
Jeg tror, at mit problem er at convertere teksten i 2 tekstbokse rigtig til DateTime format. Jeg har lagt sql-delen i en stored procedure:

ALTER procedure [dbo].[minDatoInterval]
@d1 datetime,
@d2 datetime
AS
Select Navn, Adresse, Dato
From Tabel1 inner join Tabel2
ON Tabel1.Regnr = Tabel2.Regnr
Where Dato Between @d1 AND @d2

-----------

Og her er min Codebehind kode:
---------------
...
...
...
protected void btnSoeg_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MemberConnectionString"].ConnectionString);
SqlCommand sel = new SqlCommand("minDatoInterval", conn);
sel.CommandType = CommandType.StoredProcedure;
sel.Parameters.Add("@d1", SqlDbType.DateTime);
sel.Parameters.Add("@d2", SqlDbType.DateTime);
sel.Parameters["@d"].Value = Convert.ToDateTime(txtDato1.Text);
sel.Parameters["@d2"].Value = Convert.ToDateTime(txtDato2.Text);
conn.Open();
SqlDataReader rdr = sel.ExecuteReader();
dg.DataSource = rdr;
  if (rdr.Read())
  {
    try
    {
      if (dg.PageCount == 1)
      {
        DataBind();
      }
      else
      {
        dg.CurrentPageIndex = 0;
        DataBind();
      }
    }
    catch (Exception ex)
    {
      Response.Write(ex.ToString());
    }
    finally
    {
      conn.Close();
    }           
  }
}
Avatar billede mema Nybegynder
24. januar 2009 - 16:20 #7
Jeg får følgende fejl, når jeg compilerer:

Server Error in '/' Application.
--------------------------------------------------------------------------------
String was not recognized as a valid DateTime...........
Avatar billede mema Nybegynder
24. januar 2009 - 22:01 #8
Hej arne_v. Nu virker det. Der har været en fejl ved sp'et. Tak for hjælpen. Smid et svar:)
Avatar billede arne_v Ekspert
24. januar 2009 - 22:09 #9
OK

(jeg var også noget puzzeled af den fejl besked i forhold til koden)
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

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