Avatar billede maddog2k1 Nybegynder
10. maj 2007 - 08:50 Der er 10 kommentarer og
1 løsning

Kan det laves smartere

Nogen der gidder kigge min kode igennem og se om noget kunne laves bedre ??? det er min "Datagateway" til mine sql forbindelser


koden: http://paste.uni.cc/15347
Avatar billede kalp Novice
10. maj 2007 - 09:18 #1
ja... kig på singleton pattern
:)
Avatar billede kalp Novice
10. maj 2007 - 09:19 #2
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
Avatar billede arne_v Ekspert
11. maj 2007 - 02:26 #3
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
Avatar billede alex_sleiborg Nybegynder
14. juni 2007 - 23:10 #4
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();

                    while (rdr.Read())
                    {
                        ms[0] = rdr["KørteTimer"].ToString();
                        ms[1] = rdr["KnivSlibning"].ToString() + " Ark skåret";
                    }
                    rdr.Close();
                    con.Close();
                    return ms;
                }
                catch (Exception ex)
                {
                    WriteToLog(ex.Message);
                    return null;
                }
                finally
                { con.Close(); }
            }
        }
        public void WriteToLog(string message)
        {
            try
            {
                StreamWriter Stream = new StreamWriter(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "log.txt"), true, Encoding.Default);
                Stream.Write(message);
                Stream.WriteLine("\t" + DateTime.Now + "");
                Stream.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public void LoadFromConf()
        {
            if (File.Exists(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml")))
            {
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml"));
                XmlNode xmlNode1 = xmlDocument.SelectSingleNode("/Configuration/Port");
                XmlNode xmlNode2 = xmlDocument.SelectSingleNode("/Configuration/Baud");
                XmlNode xmlNode3 = xmlDocument.SelectSingleNode("/Configuration/Parity");
                XmlNode xmlNode4 = xmlDocument.SelectSingleNode("/Configuration/Databit");
                XmlNode xmlNode5 = xmlDocument.SelectSingleNode("/Configuration/Stopbit");
                _port = xmlNode1.ChildNodes[0].InnerText;
                _baud = xmlNode2.ChildNodes[0].InnerText;
                _databit = Int16.Parse(xmlNode4.ChildNodes[0].InnerText);

                switch (xmlNode3.ChildNodes[0].InnerText)
                {
                    case "Even":
                        _parity = System.IO.Ports.Parity.Even;
                        break;
                    case "None":
                        _parity = System.IO.Ports.Parity.None;
                        break;
                    case "Odd":
                        _parity = System.IO.Ports.Parity.Odd;
                        break;
                }
                switch (xmlNode5.ChildNodes[0].InnerText)
                {
                    case "One":
                        _stopbit = System.IO.Ports.StopBits.One;
                        break;
                    case "OnePointFive":
                        _stopbit = System.IO.Ports.StopBits.OnePointFive;
                        break;
                    case "Two":
                        _stopbit = System.IO.Ports.StopBits.Two;
                        break;
                }
            }
        }
        public void WriteToConf()
        {
            XmlDocument docXML = new XmlDocument();
            docXML.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<Configuration>" +
                "<Port>" + _port + "</Port>" +
                "<Baud>" + _baud + "</Baud>" +
                "<Parity>" + _parity.ToString() + "</Parity>" +
                "<Databit>" + _databit.ToString() + "</Databit>" +
                "<Stopbit>" + _stopbit.ToString() + "</Stopbit>" +
                "</Configuration>");

            docXML.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml"));
        }
    }
}
Avatar billede arne_v Ekspert
15. juni 2007 - 02:30 #5
DAAB = Data Application Access Block

er noget kode som Microsoft har lavet - du kan finde masser af info om det på nettet.
Avatar billede arne_v Ekspert
15. juni 2007 - 02:32 #6
Det er stadigvæk noget rod med ikke static properties til static fields.
Avatar billede arne_v Ekspert
15. juni 2007 - 02:32 #7
Med hensyn til singleton så se http://www.eksperten.dk/artikler/37.
Avatar billede arne_v Ekspert
15. juni 2007 - 02:34 #8
Med hensyn til logning så kig på et lognings framework som log4net eller
den tilsvarende Microsoft application block.
Avatar billede maddog2k1 Nybegynder
15. juni 2007 - 11:07 #9
Jeg siger mange tak arne v! smid du et svar :)
Avatar billede arne_v Ekspert
15. juni 2007 - 14:18 #10
gerne
Avatar billede alex_sleiborg Nybegynder
21. juni 2007 - 11:54 #11
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";
       
        private static readonly ILog logger = LogManager.GetLogger(typeof(DataGateway));
       
        static DataGateway()
        {
            log4net.Config.DOMConfigurator.Configure();
            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;
            }
        }
        private SqlDataReader Datardr(string SQL,params SqlParameter[] param)
        {
            SqlConnection con = new SqlConnection(ConS);
            SqlDataReader rd = SqlHelper.ExecuteReader(con, CommandType.Text, SQL, param);
            return rd;
        }
        public bool WriteToDB(string SQL)
        {
            using (SqlConnection con = new SqlConnection(ConS))
            {
                try
                {
                    SqlHelper.ExecuteNonQuery(con,CommandType.Text, SQL);
                    return true;
                }
                catch (Exception ex)
                {
                    logger.Error(ex.Message);
                    return false;
                }
                finally
                { con.Close(); }
            }
        }
        public string GetCityFromZip(string Zip)
        {
            try
            {
                SqlDataReader rdr = Datardr("SELECT [by] from Postnummer where Postnummer = @zipcode", new SqlParameter("@zipcode", Zip));
                while (rdr.Read())
                {
                    Zip = rdr["By"].ToString();
                }
                rdr.Close();
                return Zip;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return null;
            }
        }
        public System.Collections.ArrayList GetAllEmployees()
        {
            try
            {
                System.Collections.ArrayList list = new System.Collections.ArrayList();
                SqlDataReader rdr = Datardr("SELECT ID,ProdKort,Fornavn,Efternavn,Adresse,Postnummer,Tlf,Email FROM Medarbejder", null);
                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();
                return list;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return null;
            }
        }
        public string[] GetMachineData(string Prodkort, string Datetime1, string Datetime2)
        {
            string[] md = new string[2];
            try
            {

                SqlDataReader rdr = Datardr("SELECT sum(DriftTimer) as samlet, sum(ProdtuktType1 + ProduktType2 + ProduktType3) as prodsamlet from Produktion where ProdKort = @prodkort and StartTid between @datetime1 and @datetime2 ",
                    new SqlParameter("@prodkort", Prodkort),
                    new SqlParameter("@datetime1", Datetime1),
                    new SqlParameter("@datetime2", Datetime2));
                while (rdr.Read())
                {
                    md[0] = rdr["samlet"].ToString();
                    md[1] = rdr["prodsamlet"].ToString() + " Ark";
                }
                rdr.Close();
                return md;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return null;
            }
        }
        public string[] MachineStatus1()
        {
            string[] ms = new string[3];
            try
            {
                SqlDataReader rdr = Datardr("SELECT KørteTimer,KnivSlibning,StartTid,Stoptid from Produktion where ID=(SELECT max(id) from produktion)", null);
                while (rdr.Read())
                {
                    ms[0] = rdr["StopTid"].ToString();
                    ms[1] = rdr["KørteTimer"].ToString();
                    ms[2] = rdr["KnivSlibning"].ToString() + " Ark skåret";
                }
                rdr.Close();
                return ms;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return null;
            }
        }
        public string[] MachineStatus2()
        {
            string[] ms = new string[2];
            try
            {
                SqlDataReader rdr = Datardr("SELECT KørteTimer,KnivSlibning from Produktion where ID=(SELECT max(id) from produktion WHERE ID < (SELECT max(id) FROM produktion))", null);
                while (rdr.Read())
                {
                    ms[0] = rdr["KørteTimer"].ToString();
                    ms[1] = rdr["KnivSlibning"].ToString() + " Ark skåret";
                }
                rdr.Close();
                return ms;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return null;
            }
        }
        public void LoadFromConf()
        {
            try
            {
                ConnectionStringSettingsCollection con = ConfigurationManager.ConnectionStrings;
                _conS = con[con[1].Name].ConnectionString;

                if (System.IO.File.Exists(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml")))
                {
                    XmlDocument xmlDocument = new XmlDocument();
                    xmlDocument.Load(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml"));
                    XmlNode xmlNode1 = xmlDocument.SelectSingleNode("/Configuration/Port");
                    XmlNode xmlNode2 = xmlDocument.SelectSingleNode("/Configuration/Baud");
                    XmlNode xmlNode3 = xmlDocument.SelectSingleNode("/Configuration/Parity");
                    XmlNode xmlNode4 = xmlDocument.SelectSingleNode("/Configuration/Databit");
                    XmlNode xmlNode5 = xmlDocument.SelectSingleNode("/Configuration/Stopbit");
                    _port = xmlNode1.ChildNodes[0].InnerText;
                    _baud = xmlNode2.ChildNodes[0].InnerText;
                    _databit = Int16.Parse(xmlNode4.ChildNodes[0].InnerText);

                    switch (xmlNode3.ChildNodes[0].InnerText)
                    {
                        case "Even":
                            _parity = System.IO.Ports.Parity.Even;
                            break;
                        case "None":
                            _parity = System.IO.Ports.Parity.None;
                            break;
                        case "Odd":
                            _parity = System.IO.Ports.Parity.Odd;
                            break;
                    }
                    switch (xmlNode5.ChildNodes[0].InnerText)
                    {
                        case "One":
                            _stopbit = System.IO.Ports.StopBits.One;
                            break;
                        case "OnePointFive":
                            _stopbit = System.IO.Ports.StopBits.OnePointFive;
                            break;
                        case "Two":
                            _stopbit = System.IO.Ports.StopBits.Two;
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
        public void WriteToConf()
        {
            XmlDocument docXML = new XmlDocument();
            docXML.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<Configuration>" +
                "<Port>" + _port + "</Port>" +
                "<Baud>" + _baud + "</Baud>" +
                "<Parity>" + _parity.ToString() + "</Parity>" +
                "<Databit>" + _databit.ToString() + "</Databit>" +
                "<Stopbit>" + _stopbit.ToString() + "</Stopbit>" +
                "</Configuration>");

            docXML.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "Configuration.xml"));
        }
    }
}
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