25. marts 2005 - 21:34Der 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;";
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?
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.
.... 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; ....
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?
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.
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?
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'
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.
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
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.
-> 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.
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.
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.
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
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[])
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?
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();
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.
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
Synes godt om
Ny brugerNybegynder
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.