Avatar billede decrypto Nybegynder
25. marts 2005 - 21:34 Der er 43 kommentarer og
1 løsning

Hvordan konverterer jeg en mySQL datetime til datetime i C#?

Følgende kode er en metode, der henter indholdet af en indkøbskurv fra en MySQL database.

public object GetCart()
{
  string strSql = "SELECT DISTINCT product.id AS product_id, product_category.photo_id AS prod_cat_photo_id, product.supplier_id, product.photo_id AS prod_photo_id, shopping_cart.guid, shopping_cart.amount, product.name AS product_name, product.price, product.description AS product_description, shopping_cart.date_issue FROM product INNER JOIN product_category ON (product.id = product_category.product_id) INNER JOIN shopping_cart ON (product_category.product_id = shopping_cart.product_id) WHERE guid = '"+ guid +"'ORDER BY product_name;";

  DbConnector dbCon = new DbConnector();
  object rdr = dbCon.DbConnect(strSql);
  dbCon.DbClose();
  return rdr;
}

----------------------------
Som mn kan se har jeg en "shopping_cart.date_issue", som i MySQL er en date time.

Jeg får bare en fejl, når jeg vil vise datoen i en datagrid.

Fejl:
Unable to convert MySQL date/time value to System.DateTime

Skal jeg konvertere i sql strengen, eller skal jeg gøre noget med min rdr.
Avatar billede burningice Nybegynder
25. marts 2005 - 21:57 #1
hvordan henter du din tid ud?... rdr, hvilken type object er det? Hvis det er en reader, har du så prøvet at bruge IDataReader.GetDateTime()-funktionen?
Avatar billede decrypto Nybegynder
25. marts 2005 - 22:10 #2
Jeg gøre bare følgende:

dg.DataSource = rdr;
dg.DataBind();

dg er mit datagrid.

Jeg kan binde data uden problemer, men ligeså snart jeg henter en datetime fra mysql så får jeg en konverterings fejl.
Avatar billede basementjack Nybegynder
26. marts 2005 - 00:33 #3
I MySQL databasen er Date's gemt som yyyy-MM-dd, som du fx i din config-fil har sat dit miljø til at være dansk, vil den forvente noget i formatet dd-MM-yyyy.

Ved ikke om det kan hjælpe dig på rette spor, men den løsning jeg bruger (ved datareader) er:

// hvor "2005-12-31" er noget jeg har hentet ud med min datareader.
DateTime.Parse("2005-12-31").ToString("dd-MM-yyyy"); // som så giver 31-12-2005.
Avatar billede decrypto Nybegynder
26. marts 2005 - 01:24 #4
Jo men mit rdr object indholder alt data hentet fra databasen, hvordan kan jeg bruge DateTime.Parse("2005-12-31").ToString("dd-MM-yyyy"); på den?

(Jeg er nybegynder)
Avatar billede basementjack Nybegynder
26. marts 2005 - 02:12 #5
1) Du dropper dit datagrid og laver det selv, med en datareader og manuelt putter dine data i tabeller, hvor du laver tricket på din Date.

2) Du laver et strongly typed dataset ud fra rdr og piller ved din Date der. Aner dog ikke hvordan man gør dette.

3) Du venter og ser om der kommer en haj fordi med et bedre svar.. :p

Det skal så siges at jeg altid bruger 1) for at have fuld kontrol. Selvgjort er som regel velgjort. :)
Avatar billede decrypto Nybegynder
26. marts 2005 - 02:19 #6
kan du give et eksempel på 1?, ikke det store men, bare et lille eksempel.
Avatar billede basementjack Nybegynder
26. marts 2005 - 12:40 #7
1) :

....
dR = db.dataReader("SELECT myDate FROM table_name");
string html = "";
if (dR!=null&&dR.HasRows)
{
  html = "<table><tr><td>Header</td></tr>";
  while (dR.Read())
  {
    html += string.Format("<tr><td>{0}</td></tr>", DateTime.Parse(dR["myDate"].ToString()).ToString("dd-MM-yyyy"));
  }
  html += "</table>";
}
lblHtml.Text = html;
....
Avatar billede decrypto Nybegynder
26. marts 2005 - 13:19 #8
Vi prøver....
Avatar billede decrypto Nybegynder
26. marts 2005 - 13:28 #9
Hvorfor kan jeg ikke have adgang til de samme metoder, når jeg i en metode returnere et object. fx. har jeg database connector, der tager connectionstreng og en sql som argumenter.

public object DbConnect(string strSql)
{
    MySqlConnection SqlConnection = new MySqlConnection(strConn);
    SqlConnection.Open();

    MySqlCommand sel = new MySqlCommand(strSql, SqlConnection);
    MySqlDataReader rdr = sel.ExecuteReader();
    return rdr;
}

Som I kan se i den nederste linje returnerer jeg rdr.

I min aspx fil gør jeg flg:

Cart CartContent = new Cart();
object rdr = CartContent.GetCart();

if rdr. <- og her har jeg ikke adgang til de samme metoder som HasRows og etc. men det har jeg i min database connector metode, Hvorfor?
Avatar billede basementjack Nybegynder
26. marts 2005 - 13:41 #10
Det er fordi du returner det som object. Prøv med disse to linier:

public MySqlDataReader DbConnect(string strSql)
{
...
}

og

MySqlDataReader rdr = CartContent.GetCart();

Så du returner en MySqlDataReader som så har metoder som HasRows.. :)
Avatar billede burningice Nybegynder
26. marts 2005 - 14:41 #11
du kan også bare sørger for at caste tilbage til DataReader før du afvikler metoder på dit object.

basementjack>> din fremgangsmåde lugter utrolig meget af gammel asp/php. Sådan noget kan man blive dræbt for i .net verdenen ;) hehe...

brug istedet for en repeater med header, item og footer-template. Heri kan man få lov at, enten bruge ItemDataBound-eventen til at lave converteringen, eller caste direkte i sin template.
Avatar billede decrypto Nybegynder
26. marts 2005 - 16:34 #12
Jeg er 'gammel' asp udvikler, og vil helst væk fra det. Det sidste eksempel fra basementjack virker ok, men den måde jeg vil klippe og klistre data sammen med HTML, hvodan gør jeg det a la .Net way?
Avatar billede burningice Nybegynder
26. marts 2005 - 16:40 #13
<asp:repeater id="rpt" runat="server">

    <HeaderTemplate>

    </HeaderTemplate>
        <table>
          <tr>
              <td>Header</td>
          </tr>
    <ItemTemplate>
        <tr>
          <td><%# DateTime.Parse(dR["myDate"].ToString()).ToString("dd-MM-yyyy") %></td>
        </tr>
    </ItemTemplate>

    <FooterTemplate>

        </table>

    </FooterTemplate>

</asp:repeater>


That should do
Avatar billede burningice Nybegynder
26. marts 2005 - 16:43 #14
hov...

<asp:repeater id="rpt" runat="server">

    <HeaderTemplate>
      <table>
          <tr>
              <td>Header</td>
          </tr>
    </HeaderTemplate>

    <ItemTemplate>
        <tr>
          <td><%# DateTime.Parse(Container.DataItem["myDate"].ToString()).ToString("dd-MM-yyyy") %></td>
        </tr>
    </ItemTemplate>

    <FooterTemplate>
        </table>
    </FooterTemplate>

</asp:repeater>
Avatar billede decrypto Nybegynder
26. marts 2005 - 16:43 #15
Alt det prøver jeg....
Avatar billede decrypto Nybegynder
26. marts 2005 - 19:53 #16
Ok. Jeg har fået mange forslag, men jeg er næste ved målet. Mit spørgsmål ang. MySqlDataReader skal følges op med flg.

Jeg har ændret min database connecter metode til:


public MySqlDataReader DbConnect(string strSql)
    {
    MySqlConnection SqlConnection = new MySqlConnection(strConn);
    SqlConnection.Open();

    MySqlCommand sel = new MySqlCommand(strSql, SqlConnection);
    MySqlDataReader rdr = sel.ExecuteReader();
    return rdr;
    }

...Og i min aspx fil skriver jeg nu....

MySqlDataReader rdr = CartContent.GetCart();

Men her får jeg en compilerings fejl, der siger:
\default.aspx.cs(70): Cannot implicitly convert type 'string' to 'MySql.Data.MySqlClient.MySqlDataReader'
Avatar billede decrypto Nybegynder
26. marts 2005 - 19:55 #17
Hvad skal jeg gøre??
Avatar billede decrypto Nybegynder
26. marts 2005 - 19:56 #18
Hmmm jeg tror jeg har fundet færten af problemet....
Avatar billede decrypto Nybegynder
26. marts 2005 - 20:00 #19
Fandt løsning på problemet.
Avatar billede basementjack Nybegynder
27. marts 2005 - 00:05 #20
Jeg har faktisk aldrig lavet asp eller php.. Er ny udspringet i Asp.Net.. :)

Og ja det er vældig smart med Datagrids, repeaters og whatnots. Men når jeg skal have edits-knapper på og slet og sådanne ting, så foretrækker jeg at gøre det selv da jeg ikke kan gennemskue det når det er ala Dot Net Way.

decrypto - Løsning. Så alt er i orden nu?
Avatar billede burningice Nybegynder
27. marts 2005 - 11:46 #21
well... man skal bare se det som objecter. Et stort legohus, hvor man kan tilføje og fjerne klodser, ændre farve på dem osv, uden at skulle tænke over de andre klodser. Selvfølgelig er der nogen objecter der ikke passer sammen, men sådan er det også med lego.

Nå, lidt af et sidespring. All i'm saying is, at hvis du har lyst til at begå dig i .Net verdenen, så skal du væk fra at blande html og kode sammen. Du kan f.eks. ikke iterere igennem alle dine rækker i din tabel når først den er renderer. Med en repeater er det ikke sværere end at lave en for-løkke

foreach (RepeaterItem in rpt.Items) {

}
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:10 #22
Jo, jeg har i mit asp altid prøvet at dele tingene op i lag, og har smidt arrays op til præsentationslaget, hvor jeg kun der har blandet HTML og data hentet fra mit business lag. Jeg har tænkt mig at bruge samme tankegang her, da det netop det jeg brugte i asp. Mit næste forløb er at kunne cykle igennem et sæt af data. Kan du fortælle mig hvordan jeg i en for each løkke kan cukle igennem min MySqlDataReader rdr objekt?

Og et sidespørgsmål: ved du om der er et sted man kan få evalueret sin kode, så man kan få en bedre kodediciplin.
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:12 #23
-> basementjack: Ja jeg har fået svar på mange ting i min påskeferie, og jeg er ved at få en ret god start i .Net verdenen. Jeg har altid haft styr på det meste rent teoretisk, og er også grunden til at jeg ved hvilken retning jeg skal gå. Problemet er bare at få det kodet vha. c# og a la .NET, og derfor har jeg brug for et lille skub.
Avatar billede burningice Nybegynder
27. marts 2005 - 14:19 #24
hvis man skal loope igennem data i en datareader er der ikke så mange andre måder end denne:

while (rdr.Read()) {
  Console.WriteLine(rdr.GetString(0));
}

Ved ikke om der findes noget automatiseret kodedisciplinstjek-program. Det er både forskelligt fra person til person, mellem patters osv. Men det er altid en god ide at være flere om at kigge noget kode. Det er tit man ikke kan se skoven for bare træer når man sidder med det selv.
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:28 #25
Mange tak for de hurtige svar.

Jeg har bare et problem med dit forslag...

Kan jeg ikke gøre noget lignende->

foreach (rdr.Record)
{
      string Navn = rdr.Record(Field[0]);
      string EfterNavn = rdr.Record(Field[1]);
      string Adresse = rdr.Record(Field[2]);
}

Oventående syntaks er det rene volapyk, og overskriver jeg sig selv efter hver omgang. Ikke desto mindre er det noget lignende det jeg er på udkig efter.
Avatar billede burningice Nybegynder
27. marts 2005 - 14:34 #26
du kan lave en OR-mapping til et BO du selv har lavet:

public class Person {
    public string Navn;
    public string Efternavn;
    public string Adresse;
}

ArrayList personer = new ArrayList();

while (rdr.Read()) {
    Person p = new Person();
    p.Navn = rdr.GetString(0);
    p.Efternavn = rdr.GetString(1);
    p.Adresse = rdr.GetString(2);
    personer.Add(p);
}


// personser indeholder nu x-antal Person-objecter
Avatar billede burningice Nybegynder
27. marts 2005 - 14:36 #27
ved godt man ikke bør lave public fields på den måde, men pakke det ind i Properties, men jeg gad ikke lige skrive så meget :P
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:37 #28
Faktisk er lige præcis det jeg er på udkig efter... jeg har en class person, og jeg vil sende bruge arrays til at 'gemme' her enkelt person.

Prøver lige dit forslag.
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:38 #29
Ja, jeg bruger også private property fields.
Avatar billede burningice Nybegynder
27. marts 2005 - 14:48 #30
problemet med arrays er at du skal kende dens størrelse når du skal oprette det, og det kan du ikke før du har itereret igennem din reader og talt op. Hvis du gerne vil have det i en Person-array (Person[]) kan dette gøre det:

public class Person {
    public string Navn;
    public string Efternavn;
    public string Adresse;
}

ArrayList coll = new ArrayList();

while (rdr.Read()) {
    Person p = new Person();
    p.Navn = rdr.GetString(0);
    p.Efternavn = rdr.GetString(1);
    p.Adresse = rdr.GetString(2);
    coll.Add(p);
}

Person[] persons = new Person[coll.Count];

for (int i = 0; i < persons.Lenght; i++) {
  persons[i] = coll[i];
}

// persons indeholder nu et array af Person-objecter (Persons[])
Avatar billede burningice Nybegynder
27. marts 2005 - 14:49 #31
Nu hvor jeg tænker over det burde dette trick også kunne gøre det, så slipper man for sin for-løkker:

Person[] persons = (Persons[])coll.ToArray();
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:58 #32
Okay, det samme problem havde jeg i mit gamel asp, hvor jeg fandt størrelsen på mit array ved at lave en count i min sql for at finde, hvor mange poster, der lå i databasen. Men kan jeg ikke angive størrelsen på arrayet udfra mit rdr, der indholder data?
Avatar billede decrypto Nybegynder
27. marts 2005 - 14:59 #33
Hov... vent fik lige nærlæst din seneste post. :0)
Avatar billede decrypto Nybegynder
27. marts 2005 - 15:02 #34
Skal jeg huske at 'inludere' (using ???) et eller andet for at kunne gøre brug af Array objektet?
Avatar billede burningice Nybegynder
27. marts 2005 - 15:04 #35
ArrayList ligger i System.Collections, så det skal du inkludere (using  System.Collections)
Avatar billede decrypto Nybegynder
27. marts 2005 - 15:06 #36
Tak endnu en gang :-)
Avatar billede decrypto Nybegynder
27. marts 2005 - 15:21 #37
hmm her min kode

ArrayList arrCart = new ArrayList();
       
while (rdr.Read())
{
    CartData C = new CartData();
    C.ProductId = rdr.GetInt32(0);
    C.CatPhotoId = rdr.GetInt32(1);
    C.SupplierId = rdr.GetInt32(2);
    C.PhotoId = rdr.GetInt32(3);
    C.CartGuId = rdr.GetString(4);
    C.Amount = rdr.GetInt16(5);
    C.ProductName = rdr.GetString(6);
    C.ProductPrice = rdr.GetFloat(7);
    C.ProductDescription = rdr.GetString(8);
    arrCart.Add(C);
}

Men hvor skriver jeg på hvilken plads i mit Array jeg gerne vil have lagt min collection ind henne?
Avatar billede decrypto Nybegynder
27. marts 2005 - 16:10 #38
Jeg poster lige min kode ind, for evaluering. Er der ikke noget jeg har overset?
Jeg har stadig brug for hjælp, når jeg skal pakke data ud i præsentationslaget. Jeg skal nok give mere end de 10 points jeg har skrevet her.

using System;
using System.Collections;
using MySql;
using MySql.Data;
using MySql.Data.MySqlClient;

public class CartData
{
    private int                _ProductId;
    private int                _PhotoId;
    private int                _CatPhotoId;
    private int                _SupplierId;
    private string            _CartGuId;
    private string            _ProductName;
    private string            _ProductDescription;
    private decimal            _ProductPrice;
    private int                _Amount;
       
    //Properties
       
    public CartData()
    {
    }
           
    public int ProductId
    {
        get    { return _ProductId;}
        set    { _ProductId = value;}
    }
    public int PhotoId
    {
        get    { return _PhotoId;}
        set    { _PhotoId = value;}
    }
    public int CatPhotoId
    {
        get    { return _CatPhotoId;}
        set    { _CatPhotoId = value;}
    }
    public int SupplierId
    {
        get    { return _SupplierId;}
        set    { _SupplierId = value;}
    }
    public string CartGuId
    {
        get    { return _CartGuId;}
        set    { _CartGuId = value;}
    }
    public string ProductName
    {
        get    { return _ProductName;}
        set    { _ProductName = value;}
    }
    public string ProductDescription
    {
        get    { return _ProductDescription;}
        set    { _ProductDescription = value;}
    }
    public decimal ProductPrice
    {
        get    { return _ProductPrice;}
        set    { _ProductPrice = value;}
    }
    public int Amount
    {
        get    { return _Amount;}
        set    { _Amount = value;}
    }

}

    /// <summary>
    /// Summary description for Cart.
    /// </summary>
public class CartContent
{
    string guid;

    public CartContent()///Constructor
    {
        //Læs guid fra cookie hos klienten.
        Customer MyCustomer = new Customer();
        this.guid = MyCustomer.GetCookie("CustomerGuId");
    }
       
    //Hent indkøbskurv
    public ArrayList GetCart()
    {
        string strSql = "SELECT DISTINCT product.id AS product_id, product_category.photo_id AS prod_cat_photo_id, product.supplier_id, product.photo_id AS prod_photo_id, shopping_cart.guid, shopping_cart.amount, product.name AS product_name, product.price as product_price, product.description AS product_description FROM product INNER JOIN product_category ON (product.id = product_category.product_id) INNER JOIN shopping_cart ON (product_category.product_id = shopping_cart.product_id) WHERE guid = '"+ guid +"'ORDER BY product_name;";
        DbConnector dbCon = new DbConnector();
        MySqlDataReader rdr = dbCon.DbConnect(strSql);
        dbCon.DbClose();

        ArrayList arrCart = new ArrayList();
       
        while (rdr.Read())
        {
            CartData c = new CartData();

            c.ProductId = Convert.ToInt32(rdr["product_id"]);
            c.CatPhotoId = Convert.ToInt32(rdr["prod_cat_photo_id"]);
            c.SupplierId = Convert.ToInt32(rdr["supplier_id"]);
            c.PhotoId = Convert.ToInt32(rdr["photo_id"]);
            c.CartGuId = rdr["guid"].ToString();
            c.Amount = Convert.ToInt32(rdr["amount"]);
            c.ProductName = rdr["product_name"].ToString();
            c.ProductPrice = Convert.ToDecimal(rdr["product_price"]);
            c.ProductDescription = rdr["product_description"].ToString();
            arrCart.Add(c);
        }
        return arrCart;
    }

}
Avatar billede burningice Nybegynder
27. marts 2005 - 17:27 #39
du skriver at du gerne vil kunne indsætte et CartData-object et bestemt sted i ArrayList'en. Hvorfor?

Well, det kan man ikke umiddelbart, da en ArrayList bare er en liste. Du kan altid lave sort på den efter du har fyldt den for at få sorteret dine CartData-objecter i en ønsket rækkefølge, men det nemmeste ville være at bruge en SORT BY-clause i din sql, så at din reader læser posterne i den rækkefølge CartData-objecterne skal oprettes og tilføjes til listen.
Avatar billede decrypto Nybegynder
27. marts 2005 - 18:44 #40
Ok så et Array er ikke det samme som en ArrayList.
Avatar billede burningice Nybegynder
27. marts 2005 - 20:42 #41
:) nej...
Avatar billede decrypto Nybegynder
25. maj 2005 - 11:12 #42
Send et svar ind....så du kan få point.
Avatar billede burningice Nybegynder
25. maj 2005 - 21:50 #43
svar :)
Avatar billede burningice Nybegynder
25. maj 2005 - 21:53 #44
prøv forresten at kigge på FxCop (http://www.gotdotnet.com/team/fxcop/) som er et program der kan tjekke din kode for fejl og designmæssige uhensigtsmæssigheder
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