Autor Beitrag
roger85
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 08.12.15 12:28 
Halle zusammen,
ich hoffe hier hat jmd eine idee zu meinem Problem.
Ich habe einen Dienst geschrieben der daten auf ein sql server schicken soll. Leider sendet er keine Daten oder gibt einen Fehler aus.

Leider schreibt auch das Logfile keine fehler, weswegen ich keine ahnung habe woran es liegen könnte.

Hier der Code:

Service.cs
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
private System.Timers.Timer timer;
public ServerListerstellen SL = new ServerListerstellen();
public Connection c = new Connection();

protected override void OnStart(string[] args)
        {
            try
            {
               
                this.timer = new System.Timers.Timer(120000D); 
                this.timer.AutoReset = true;
                this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
                this.timer.Start();
            }
            catch (Exception ex)
            {
                WriteLogFile.WriteInLog(ex.ToString());
            }
        }

        protected override void OnStop()
        {
            this.timer.Stop();
            this.timer = null;
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
               
                SL.datenHolen();
            }
            catch (Exception ex)
            {
                WriteLogFile.WriteInLog(ex.ToString());
            }

            try
            {
                string sqlQuery = "INSERT INTO [DB] (CPU_cores, Customer, Average_CPU_usage, Free_HDD_space, ServerIP, "
                                   + "Max_HDD_space, Max_RAM_space, Available_RAM_space, ServerNames, Collect_time, ServerUUID )"
                                   + "VALUES ('" + SL._ccpu + "', '" + SL._customer + "', '" + SL._cpu + "', '" + (((SL._fhdd / 1024) / 1024) / 1024) + "', '"
                                   + "" + SL._ip + "', '" + (((SL._mhdd / 1024) / 1024) / 1024) + "', '" + (SL._mram / 1024) + "', '" + (SL._ram / 1024) + "', '"
                                   + "" + SL._sname + "', '" + DateTime.Now + "', '" + SL._uuid + "' )";

                c.OpenSqlConnection();
                c.ExecuteQuery(sqlQuery);
           }
           catch (Exception ex)
            {
                WriteLogFile.WriteInLog(""+ex.ToString());
            }


und die Connection klasse
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
public class Connection
    {
        private static readonly string SQL_CON = "Data Source = x.x.x.x,1434; Provider=SQLOLEDB; Initial Catalog = DB; Persist Security Info=True;User ID = XX; Password=XXXXXX";

public void ExecuteQuery(string sqlQuery)
        {
            CloseSqlConnection();
            OpenSqlConnection();
            try
            {
                Command = new OleDbCommand(sqlQuery, SqlConnection);
                Command.ExecuteNonQuery();
               
            }
            catch (Exception ex)
            {
                WriteLogFile.WriteInLog("ExecuteQuery " + ex.ToString() + "- Query => " + sqlQuery);
            }
        }

        private static OleDbCommand command;
        public static OleDbCommand Command
        {
            get { return command; }
            set { command = value; }
        }

        public void OpenSqlConnection()
        {
            try
            {
                if (SqlConnection.State.ToString() == "Closed")
                {
                    SqlConnection.Open();
                }
            }
            catch (Exception ex)
            {
               WriteLogFile.WriteInLog("OpenSql " + ex.ToString());
            }
        }

        public void CloseSqlConnection()
        {
            try
            {
                if (SqlConnection.State.ToString() != null && SqlConnection.State.ToString() == "Open")
                {
                    SqlConnection.Close();
                }
            }
            catch (Exception ex)
            {
                WriteLogFile.WriteInLog("CloseSql " + ex.ToString());
            }
        }


        private static string connectionString = SQL_CON;
        public static string ConnectionString
        {
            get { return connectionString; }
            set { connectionString = value; }
        }
        private static OleDbConnection sqlConnection = new OleDbConnection(ConnectionString);
        public static OleDbConnection SqlConnection
        {
            get { return sqlConnection; }
            set { sqlConnection = value; }
        }
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4262
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 08.12.15 14:21 
a.) Der Service läuft auch und beendet sich nicht sofort wieder?
b.) Das loggen aus dem Service funktioniert prinzipiell? Du hast es geprüft? Ich würde Standard(nichtFehler)meldungen mit ausgeben aka "OnStartCalled", "TimerStarted", "OnStopCalled", "ExecutedSQL xyz" etc.
c.) Die Wahrscheinlickeit das dein Insert string so wie du in Zusammenbastelst funktioniert is extrem klein. Und wenn er gerade funktioniert würde ich mich nicht wundern wenn sobald sich was am System ändert er nicht mehr funktioniert. Du kümmerst dich kein bißchen um das passende Format der Daten sondern wirst die einfach per String Concatenation in den SQL string. Das kann nur schief gehen.
Benutze Parameter für die Werte.
roger85 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 08.12.15 15:06 
Erstmal danke für die Antwort.

Ich bin recht neu was das programmieren angeht, daher verstehe ich nicht so ganz was du mit den Parametern meinst. ich habe mir das jetzt mal bei Rheinwerk durchgelesen und es klingt so als wenn ich aus der db vorher lesen soll.
Dazu soll der dienst aber keine rechte bekommen.

a.) Der dienst startet und bleibt auch an.
b.) der sql befehl als auch meine Log klasse funktionieren. Habe mir jetzt den string jedesmal mit loggen lassen und das geht super.

wenn ich das ganze mit WinForm starte schreibt er auch in die db nur halt als dienst nicht. Da kommt es mir vor als wenn er das schreiben in die db überspringt.
kann es sein das so ein windowsdienst spezielle berechtigungen brauch?

unter serviceProcessInstaller habe ich LocalSystem eingestellt. gibts da vlt. noch etwas anderes?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4262
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 08.12.15 15:08 
Wohin versucht den WriteLogFile zu schreiben?
roger85 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 08.12.15 15:16 
in

C:/Programme(86)/MeinOrdner/Ordner/Log.txt

aber wie gesagt wenn ich den string mitschreiben lasse, geht das mit dem Log.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4262
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 08.12.15 15:31 
Wenn es funktioniert dann funktioniert es. Programme(86) ist aber kein Ordner wo man Daten reinschreiben sollte. Normale User haben da nur begrenzte Rechte. Spätenstens seit XP ist es Usus Programme und Daten von Programmen räumlich zu trennen.

Dann sehe ich jetzt neben den vielen kleinen Unschönheiten (Sql zusammenbasteln, Connectionverwaltung eher kaputt, schreiben in potentiell geschütze Ordner) nicht warum das nicht mal funktionieren sollte.

Edit: Nebenbei Port 1434 hört sich nach Sql Server an. Wenn das einer ist wieso benutzt du OleDB?
roger85 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 08.12.15 17:58 
ich bin auch ein Trottel...

habe InstallShield den falschen pfad zu release gegeben ...deshalb ging es nicht.. danke für die Hilfe.
Alledings würde mich jetzt das thema mit dem "Standard(nichtFehler)meldungen" interessieren "OnStartCalled" zBsp. .. da spuckt google leider auch nichts brauchbares aus.
hast du da noch ne link für mich?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4262
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 08.12.15 19:28 
Nee, Da hast du mich missverstanden. Das ist nix spezielles sondern ich wollte einfach nur das du weglogst wenn eine Methode aufgerufen wurde und als ein Programmiergeschädigter schreibe ich auch schonmalNormalenTextInPascalCase ;) Das hat aber nix zu sagen. OnStartCalled ist also was von mir ausgedachtes.