Announcement

Collapse
No announcement yet.

Log in SQL Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Log in SQL Datenbank

    Hallo, ich schreibe an einem kleinen IRC Bot. Das Grundgerüst ist soweit, mit Hilfe von SmartIrc4net, erstellt. Nun würde ich gerne folgendes Feature realisieren:

    Sämtlicher Verkehr soll in eine SQL Datenbank geschrieben werden. Später dann nach bestimmten Kriterien. Aktuell häng ich, aber zuerst, was ich bereits habe:

    Code:
    #region "using directives"
    using System;
    using System.Collections.Generic;
    using System.Text;
    using MySql.Data.MySqlClient;
    #endregion
    
    namespace ircBot.Plugins {
    	public class Log : Plugin {
    
            #region "Constructor/Destructor"
            public Log(Bot bot)
                : base(bot)
            {
                Bot.OnRawMessage += new IrcEventHandler(Bot_OnRawMessage);
                Bot.OnChannelMessage += new IrcEventHandler(Bot_OnMessage);
                Bot.OnQueryMessage += new IrcEventHandler(Bot_OnMessage);
            }
            #endregion
    
            #region "Event handles"
    
            //mySQL connection
            void WriteSQL(object sender, System.EventArgs e)
            {
                string MyConString = "SERVER=localhost;" +
                    "DATABASE=database;" +
                    "UID=uid;" +
                    "PASSWORD=password;" +
                    "Charset = latin1;";
                try
                {
                    MySqlConnection connection = new MySqlConnection(MyConString);
                    MySqlCommand command = connection.CreateCommand();
                    MySqlDataReader Reader;
                    connection.Open();
                    Console.WriteLine("Verbindung zum SQL Server hergestellt");
                }
    
                catch (MySql.Data.MySqlClient.MySqlException ex)
                {
                    switch (ex.Number)
                    {
                        case 0:
                            Console.WriteLine("Cannot connect to server.  Contact administrator");
                        case 1045:
                            Console.WriteLine("Invalid username/password, please try again");
                    }
                }
                Reader = command.ExecuteReader();
                connection.Close();
            }
            #endregion
        }
    }
    Ich hoffe, man kann erkennen, worauf ich hinaus möchte.

    Der Bot erstellt anhand von Daten aus einem xml File für jeden eingetragenen Server einen eigenen Thread. Sollte dann auch in verschiedene Bereiche in die Datenbank schreiben.
    Wenn ich bisher gefundenes richtig interpretiert habe, muss ich die reinkommenden Nachrichten in einen Stream umleiten und diesen dann in die Datenbank schreiben.
    Zuletzt editiert von glaslos; 03.02.2008, 00:17.

  • #2
    Originally posted by glaslos View Post
    Sämtlicher Verkehr soll in eine SQL Datenbank geschrieben werden. Später dann nach bestimmten Kriterien. Aktuell häng ich, aber zuerst, was ich bereits habe:

    Ich hoffe, man kann erkennen, worauf ich hinaus möchte.
    Nein, nicht wirklich. Du willst in die Datenbank schreiben, arbeitest aber mit DbDataReader. Du erzeugst einen DbCommand, aber wo bleibt der CommandText? Auch gibst Du keinerlei Hinweise, was nicht wunschgemäß funktioniert (z.B. Arbeitsablauf, Art und Inhalt der Fehlermeldungen).

    Wenn ich bisher gefundenes richtig interpretiert habe, muss ich die reinkommenden Nachrichten in einen Stream umleiten und diesen dann in die Datenbank schreiben.
    Das mag wohl so sein, stimmt aber nicht unbedingt. Wie sieht denn die Struktur der DB-Tabellen und die Struktur der Nachrichten aus? Beides muss natürlich aufeinander angepasst werden.

    Nach meinem Verständnis benötigst Du einen DbCommand "INSERT INTO...", dem die Teile der Nachrichten als Parameter übergeben werden; dieser Befehl wird mit ExecuteNonQuery abgeschickt. Das Ganze sieht etwa so aus:
    Code:
    void WriteSql(Bot bot) {
        string MyConString = ...;
        using(MySqlConnection connection = new MySqlConnection(MyConString)) {
            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "INSERT INTO BOT (...) VALUES " +
                "@Nr, @Msg)";
            command.Parameters.AddWithValue("@Nr", bot.Number);
            command.Parameters.AddWithValue("@Msg", bot.Message);
            try {
                connection.Open();
                command.ExecuteNonQuery();
            } catch(...) { ... }
        }
    }
    Auf DbConnection.Close kann wegen des using-Blocks verzichtet werden. Benutze für die Übergabe der Werte unbedingt Parameters und keinesfalls eine lange String-Verknüpfung.

    Die Bot-Eigenschaften habe ich natürlich nur simuliert; ich kenne diese Klasse nicht. Es sollte klar werden, wie ich es meine.

    Ich hoffe, das bringt Dich etwas weiter. Jürgen

    PS. Datenbanken unter NET gehört ins Unterforum ADO.NET. Das hat nichts mit der Sprache C# zu tun.

    Comment

    Working...
    X