nu er alle dine metoder statiske.. med singleton skal de bare være public og det eneste statiske er referencen til sig selv og metoden som henter en instans af klassen.
men læs om singleton pattern så forstår du det.. du kan google det da der er skrevet masser om det
1) hvorfor er klassen ikke public ? 2) connection string bør smide i en config fil 3) brug parameters i dine SQL sætninger 4) du bør ikke bruge MessageBox.Show i en data klasse - det kalde hører hjemme i UI 5) åben for append + skriv + luk af log fil hver gang der skal skrives en linie er ikke effektivt 6) din log funktion er heller ikke thread safe 7) kig evt. lidt på DAAB som indeholder noget tilsvarende funktionalitet 8) hvorfor er port string ? 9) lige netop port kan faktisk ændres og derfor er hele static konceptet ikke thread safe
Hej Arne og Kalp, jeg har hele sourcen til projektet. Og er gået igang med rette den datagateway til som i siger, så koden gerne skulle blive så optimal så muligt. Jeg gør dette for jeg godt kunne tænke mig at blive dygtigere til c#.
1) Klassen er nu public 2) Connection string kunne også sagtens ligge i en xml fil, men dette er ikke valgt i dette tilfælde. 3) Så er der sat parameters på alle SQL sætninger. I metoden GetCityFromZip er db'en sat til at modtage en VarChar, selvom feltet i databasen faktisk er en int. Caster mssql db'en så selv fra string til int? Eller skal jeg lave det om til cmd.Parameters.Add("@zipcode", System.Data.SqlDbType.Int).Value = int.Parse(ZipCode); 4) Så er alle MessageBox.Show fjernet, undtagen fra WriteToLog. Da jeg ikke er sikker på hvordan det så skal laves 5) Gider du give et eksempel på hvordan det gøres effektivt, det er jo ikke særligt ofte der skal skrives til log fil? 6) Gider du også lavet et eksempel? 7) Kender ikke DAAB, gider du uddybe? 8) Port er string, da det er det metoden forventer. SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 9) Må også meget gerne uddybe her
Har derefter prøvet at lave klassen til et singleton pattern, men er langt fra sikkert på det er gjort korrekt. Så kunne være fedt med noget feed back. Jeg vil også gerne give 100 ekstra point, for nogle gode besvarelser
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Windows.Forms; using System.Data.SqlClient; using System.Xml;
namespace kortlæser { public class DataGateway { private static DataGateway instance; private static string _conS = "server=(local)\\SQLEXPRESS;database=PO;Integrated Security=SSPI"; private static string _port = ""; private static string _baud = ""; private static System.IO.Ports.Parity _parity = System.IO.Ports.Parity.Even; private static Int16 _databit = 8; private static System.IO.Ports.StopBits _stopbit = System.IO.Ports.StopBits.None; private const string _dbError = "Der opstod fejl da der skulle forbindes til databasen\nYderligere information findes i log filen"; static DataGateway() { instance = new DataGateway(); }
private DataGateway() { }
public static DataGateway Instance { get { return instance; } } public string ConS { get { return _conS; } set { if (_conS != value) { _conS = value; } } } public string ComPort { get { return _port; } set { if (_port != value) { _port = value; } } } public string Baud { get { return _baud; } set { if (_baud != value) { _baud = value; } } } public System.IO.Ports.Parity Parity { get { return _parity; } set { if (_parity != value) { _parity = value; } } } public Int16 DataBit { get { return _databit; } set { if (_databit != value) { _databit = value; } } } public System.IO.Ports.StopBits StopBit { get { return _stopbit; } set { if (_stopbit != value) { _stopbit = value; } } } public string DBError { get { return _dbError; } } public bool WriteToDB(string SQL) { using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand(SQL, con); con.Open(); cmd.ExecuteNonQuery(); con.Close(); return true; } catch (Exception ex) { WriteToLog(ex.Message); return false; } finally { con.Close(); } } } public string GetCityFromZip(string ZipCode) { string City = string.Empty; using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand("SELECT [by] from Postnummer where Postnummer = @zipcode", con); cmd.Parameters.Add("@zipcode", System.Data.SqlDbType.VarChar).Value = ZipCode;
con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { City = rdr["By"].ToString(); } rdr.Close(); con.Close(); return City; } catch (Exception ex) { WriteToLog(ex.Message); return null; } finally { con.Close(); } } } public System.Collections.ArrayList GetAllEmployees() { using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand("SELECT ID,ProdKort,Fornavn,Efternavn,Adresse,Postnummer,Tlf,Email FROM Medarbejder", con); System.Collections.ArrayList list = new System.Collections.ArrayList(); con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { list.Add(new Medarbejder((int)rdr[0], (int)rdr[1], (string)rdr[2], (string)rdr[3], (string)rdr[4], (int)rdr[5], (int)rdr[6], (string)rdr[7])); } rdr.Close(); con.Close(); return list; } catch (Exception ex) { WriteToLog(ex.Message); return null; } finally { con.Close(); } } } public string[] GetMachineData(string Prodkort, string Datetime1, string Datetime2) { string[] MachineData = new string[2]; using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand("SELECT sum(DriftTimer) as samlet, sum(ProdtuktType1 + ProduktType2 + ProduktType3) as prodsamlet from Produktion where ProdKort = @prodkort and StartTid between @datetime1 and @datetime2 ", con); cmd.Parameters.Add("@prodkort", System.Data.SqlDbType.VarChar).Value = Prodkort; cmd.Parameters.Add("@datetime1", System.Data.SqlDbType.VarChar).Value = Datetime1; cmd.Parameters.Add("@datetime2", System.Data.SqlDbType.VarChar).Value = Datetime2;
con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { MachineData[0] = rdr["samlet"].ToString(); MachineData[1] = rdr["prodsamlet"].ToString() + " Ark"; } rdr.Close(); con.Close(); return MachineData; } catch (Exception ex) { WriteToLog(ex.Message); return null; } finally { con.Close(); } } } public string[] MachineStatus1() { //Sql querystreng som skal eksekveres. string SQL = "SELECT KørteTimer,KnivSlibning,StartTid,Stoptid from Produktion where ID=(SELECT max(id) from produktion)"; string[] ms = new string[3]; using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand(SQL, con); con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { ms[0] = rdr["StopTid"].ToString(); ms[1] = rdr["KørteTimer"].ToString(); ms[2] = rdr["KnivSlibning"].ToString() + " Ark skåret"; } rdr.Close(); con.Close(); return ms; } catch (Exception ex) { WriteToLog(ex.Message); return null; } finally { con.Close(); } } } public string[] MachineStatus2() { string SQL = "SELECT KørteTimer,KnivSlibning from Produktion where ID=(SELECT max(id) from produktion WHERE ID < (SELECT max(id) FROM produktion))"; string[] ms = new string[2]; using (SqlConnection con = new SqlConnection(ConS)) { try { SqlCommand cmd = new SqlCommand(SQL, con); con.Open(); SqlDataReader rdr = cmd.ExecuteReader();
De static fields var blot en forglemmelse. Er der styr på nu. Databasen kan åbenbart godt selv finde ud af at caste en string om til en int. Skal jeg lade min app caste, så databasen modtager en korrekt type? Jeg har læst den artikel om singleton, må dog indrømme jeg forstår det ikke helt. Men hvad mangler der nu? Har rettet noget mere til nu
using System; using System.Data; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Xml; using log4net; using System.Configuration; using Microsoft.ApplicationBlocks.Data;
namespace kortlæser { public class DataGateway { private static DataGateway instance; private string _conS = null, _port = null, _baud = null; private System.IO.Ports.Parity _parity = System.IO.Ports.Parity.Even; private Int16 _databit = 8; private System.IO.Ports.StopBits _stopbit = System.IO.Ports.StopBits.None; private const string _dbError = "Der opstod fejl da der skulle forbindes til databasen\nYderligere information findes i log filen";
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.