Diskuze: c# local messenger

C# .NET .NET (C# a Visual Basic) c# local messenger American English version English version

Avatar
Martin Svoboda:

Čaute borci,
robím posielanie správ v rámci firmy cca 800 PC a rozmýšľam nad tým ako posielať správy skupinám. Vytvorená skupina bude na sql. Vie mi niekto poradiť niejaký cyklus (v skupine 5 adresátov) kde by správu odoslalo napr. 5x s piatimi rôznymi adresátmi?
Tu je časť kódu pre jedného adresáta.

public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       private void Form1_Load(object sender, EventArgs e)
       {
           IPHostEntry he;
           string myip = "";
           he = Dns.GetHostEntry(Dns.GetHostName());
           foreach(IPAddress ip in he.AddressList)
           {
               if (ip.AddressFamily==AddressFamily.InterNetwork)
               {
                   myip = ip.ToString();
               }
           }
           label1.Text = myip;
       }

       string pc = System.Environment.MachineName;

       DateTime cas = DateTime.Now;


       int sk = 1;
       private void odoslat_Click(object sender, EventArgs e)
       {
           if (textBox1.Text.Length == 0)
           {
               MessageBox.Show("Neviplnili ste predmet správy!");
           }
           else
           {

           string constring = "Server=10.7.18.35;Database=OitDB;Uid=martin;Pwd=;";
           string Query = "INSERT INTO OitDB.nrp(id,pc,ip,komu,datum,predmet,sprava,skupina)VALUES('" + this.idtxt.Text + "','" + pc + "','" + this.label1.Text + "','" + this.comboBox1.Text + "','" + cas + "','" + this.textBox1.Text + "','" + this.pisat.Text + "','" + sk +"');";
           MySqlConnection conDatabase = new MySqlConnection(constring);
           MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);
           MySqlDataReader myReader;

           try
           {
               conDatabase.Open();
               myReader = cmdDatabase.ExecuteReader();
               MessageBox.Show("Správa odoslaná!");
               while (myReader.Read())
               {

               }

           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);

           }
           }

       }
 
Odpovědět 3.12.2015 15:06
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Mám lehce zmatení babylónu. Adresát je příjemce nebo odesílatel? Zprávou se myslí patrně email ... nebo chat?

Editováno 3.12.2015 18:37
 
Nahoru Odpovědět 3.12.2015 18:37
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Mimochodem identifikovat uživatele přes IP je jednoznačné pouze na první pohled. Co když si uživatel přesedne na jiný stroj a bude chtít chatovat tam. Co když dostane nový počítač s novou IP. Co když mu DHCP na novou IP?

Tam imho bude lepší ho identifikovat přihlášením uživatelem.

Editováno 3.12.2015 19:06
 
Nahoru Odpovědět 3.12.2015 19:05
Avatar
Martin Svoboda:

Adresát je príjemca. Riešiť to stačí cez ip (máme dns) a pc má každý svoj. No každopádne som narazil na viac problémov ako som čakal. Správy zobrazujem v datagridview ale nefunguje mi refresh tak ako potrebujem (timer a button neprichádza k úvahe) nevieš ako viem urobiť automatický refresh keď pribudne nový riadok? No a tiež niejaký cyklus pre priradenie viacerých príjemcov jednej správy.
Ďakujem.

 
Nahoru Odpovědět 3.12.2015 19:36
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Martin Svoboda
Milan Křepelka:

Jo, ještě. Refreš je špatný nápad. Dostaneš se do dalších pastiček. Na to si založ další vlákno. Myslím, že mnoho zdejších by mělo co k tomu říci.

 
Nahoru Odpovědět 4.12.2015 6:16
Avatar
Odpovídá na Milan Křepelka
Martin Svoboda:

Dobre ďakujem. Z toho odkazu mi nieje jasné ako spraviť dajaký cyklus na zápis do sql.

 
Nahoru Odpovědět 4.12.2015 9:21
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Martin Svoboda
Milan Křepelka:

Asi ti moc nerozumím.

1. Myslím, že by ses měl seznámit se zdejším seriálem. Dej tomu pár hodin, myslím, že ti to pomůže

http://www.itnetwork.cz/csharp/databaze

2. Jaký cyklus ? Jaká data chceč procházet a vkládat? To mi není jasné.

Principielně iteruješ nějaká data a potom část
tu část bude potřeba samozřejmě dost polepšit, ale to už nechám na tobě

string constring = "Server=10.7.18.35;Database=OitDB;Uid=martin;Pwd=;";
           string Query = "INSERT INTO OitDB.nrp(id,pc,ip,komu,datum,predmet,sprava,skupina)VALUES('" + this.idtxt.Text + "','" + pc + "','" + this.label1.Text + "','" + this.comboBox1.Text + "','" + cas + "','" + this.textBox1.Text + "','" + this.pisat.Text + "','" + sk +"');";
           MySqlConnection conDatabase = new MySqlConnection(constring);
           MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);
           MySqlDataReader myReader;

           try
           {
               conDatabase.Open();
               myReader = cmdDatabase.ExecuteReader();

  // !!tohle je tady k ničemu
while (myReader.Read())
               {

               }

           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);

           }

zabalíš do metody kterou budeš v tom cyklu volat

Editováno 4.12.2015 10:38
 
Nahoru Odpovědět 4.12.2015 10:37
Avatar
Odpovídá na Milan Křepelka
Antonín Tonini:

On totiž může poslat za jedno volání jen jednu zprávu tomu konkrétnímu adresátovi. On tím cyklem myslí, aby to odeslalo tu samou zprávu těm, kteří mají v údaji stejnou skupinu, tedy načíst všechny jejichž název/číslo skupiny je rovno požadované. Akorát nevím, jestli je dobré to mít takto všechno pohromadě a ne odděleně a pospojované pomocí ID.

 
Nahoru Odpovědět 4.12.2015 11:57
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Antonín Tonini
Milan Křepelka:

Taková myšlenka je pravděpodobná. Ale vyžadovala by tabulky pro správy uživatelů, případně skupin, a s tou by se nám počítám svěřil.

 
Nahoru Odpovědět 4.12.2015 12:06
Avatar
Martin Svoboda:

No tak som to trošku prerobil a tak ako povedal Antonín potrebujem aby to odoslalo jednu správu viacerím užívateľom.
Mám tabuľku kde mám užívateľov.

ID Skupina NazovPC
1 skupina1 pc1
2 skupina1 pc2
3 skupina1 pc3
4 skupina1 pc4

a potrebujem odoslať záznam na server kde jedna správa bude odoslaná viac krát s iným užívateľom v tabuľke.

public class User
       {
           public int ID { get; set; }
           public string NamePC { get; set; }
       }

       private void button2_Click(object sender, EventArgs e)
       {
           string constring = "Server=;Database=OitDB;Uid=martin;Pwd=;";
           string Query = "SELECT id,namepc FROM OitDB.skupina where nazovskup='" + this.comboBox3.Text + "'";
           MySqlConnection conDatabase = new MySqlConnection(constring);
           MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);
           MySqlDataReader reader = cmdDatabase.ExecuteReader();
           List<User> users = new List<User>();
           while (reader.Read())
           {
               var user = new User();
               user.ID = int.Parse(reader.GetString(0));
               user.NamePC = reader.GetString(1);
               users.Add(user);
           }
           foreach (var item in users)
           {
               constring = "Server=;Database=OitDB;Uid=martin;Pwd=;";
               Query = "INSERT INTO OitDB.nrp(id, pc, ip, komu, datum, predmet, sprava, skupina)VALUES('" + this.idtxt.Text + "', '" + pc + "', '" + this.label1.Text + "', '" + this.comboBox1.Text + "', '" + cas + "', '" + this.textBox1.Text + "', '" + this.pisat.Text + "', '" + users +"'); ";


               try
               {
                   conDatabase.Open();
                   reader = cmdDatabase.ExecuteReader();
                   MessageBox.Show("Správa odoslaná!");
                   while (reader.Read())
                   {

                   }

               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);

               }
           }
       }

v tomto kóde mi hlási chybu pri executereader

 
Nahoru Odpovědět 10.12.2015 13:25
Avatar
Nahoru Odpovědět 10.12.2015 13:40
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:

Na riadku: MySqlDataReader reader = cmdDatabase.E­xecuteReader(); píše chybu:
An unhandled exception of type 'System.Invali­dOperationExcep­tion' occurred in MySql.Data.dll

 
Nahoru Odpovědět 10.12.2015 14:05
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

A jseš si jistý že je nějaká hodnota v tom

this.comboBox3.Text

?
Resp. že ten příkaz ví, jaká tam je hodnota?

Editováno 10.12.2015 23:20
Nahoru Odpovědět 10.12.2015 23:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:

tak skúšal som aj priamo zapísať čo má hľadať

string Query = "SELECT id,namepc FROM OitDB.skupina where nazovskup= mojask";

ale stále mi hlási tú istú chybu

 
Nahoru Odpovědět 11.12.2015 7:22
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

A sloupce a název tabulky jsou opravdu nazvané takto? Nejsou tam někde třeba velká písmena, nebo tak něco?

Nahoru Odpovědět 11.12.2015 7:33
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:

Nie všetko sedí, už viac krát som to kontroloval. Do datagridview mi pekne zobrazuje všetky dáta aj s výberovou podmienkou

 
Nahoru Odpovědět 11.12.2015 7:46
Avatar
Odpovídá na Martin Svoboda
Antonín Tonini:

K tomu SQL příkazu, tam bys měl používat parametrizované hodnoty (kvůli SQL injection)

SELECT id,namepc FROM [OitDB.skupina] where nazovskup='@skupina'
cmdDatabase.AddWithValue("@skupina", this.comboBox3.Text);

K té chybě, nějaké podrobnější informace tam nevypisuje? Máš před použitím readeru otevřené spojení?

 
Nahoru Odpovědět 11.12.2015 10:25
Avatar
Martin Svoboda:

áno spojenie je otvorené. skopíroval som si kód z iného projektu a teraz mi hlási že nieje otvorený reader v riadku

while (reader.Read())

tu je celý kód

public class User
       {
           public string skup { get; set; }
           public string NamePC { get; set; }
       }

       private void button2_Click(object sender, EventArgs e)
       {
           string sdwConnectionString = "Server=***;Database=OitDB;Uid=martin;Pwd=;";
           MySqlConnection sdwDBConnection = new MySqlConnection(sdwConnectionString);
           sdwDBConnection.Open();
           string query = "SELECT id,namepc FROM OitDB.skupina where nazovskup= 'mojask' ";
           MySqlCommand queryCommand = new MySqlCommand(query, sdwDBConnection);
           MySqlDataReader reader = queryCommand.ExecuteReader();
           DataTable dataTable = new DataTable();
           dataTable.Load(reader);


           List<User> users = new List<User>();

           while (reader.Read())
           {
               var user = new User();
               user.skup = reader.GetString(0);
               user.NamePC = reader.GetString(1);
               users.Add(user);
           }
           foreach (var item in users)
           {
               sdwConnectionString = "Server=***;Database=OitDB;Uid=martin;Pwd=;";
               query = "INSERT INTO OitDB.nrp(id, pc, ip, komu, datum, predmet, sprava, skupina)VALUES('" + this.idtxt.Text + "', '" + pc + "', '" + this.label1.Text + "', '" + this.comboBox1.Text + "', '" + cas + "', '" + this.textBox1.Text + "', '" + this.pisat.Text + "', '" + users +"'); ";


               try
               {
                   sdwDBConnection.Open();
                   reader = queryCommand.ExecuteReader();
                   MessageBox.Show("Správa odoslaná!");
                   while (reader.Read())
                   {

                   }

               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);

               }
           }
       }
 
Nahoru Odpovědět 11.12.2015 10:52
Avatar
Odpovídá na Martin Svoboda
Antonín Tonini:

Mám pocit, že DataTable.Load(re­ader) reader uzavře po dokončení načítání. No, odkrokuj to a dívej se na stavy.

Editováno 11.12.2015 11:18
 
Nahoru Odpovědět 11.12.2015 11:16
Avatar
Martin Svoboda:

nakoniec som začal písať od znova a došiel som tu

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace sql
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (MySqlConnection cnn = new MySqlConnection("Server=10.7.18.35;Database=OitDB;Uid=martin;Pwd=;"))
            {
                MySqlDataAdapter da = new MySqlDataAdapter("SELECT namepc FROM skupina where nazovskup= 'mojask' ", cnn);
                DataSet ds = new DataSet();
                da.Fill(ds, "skupina");

                List<string> skName = new List<string>();
                foreach (DataRow row in ds.Tables["skupina"].Rows)
                {
                    skName.Add(row["namepc"].ToString());

                    string constring = "Server=10.7.18.35;Database=OitDB;Uid=martin;Pwd=;";
                    string Query = "INSERT INTO OitDB.skup(uzivatel)VALUES('" + skName + "');";
                    MySqlConnection conDatabase = new MySqlConnection(constring);
                    MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);
                    MySqlDataReader myReader;

                    try
                    {
                        conDatabase.Open();
                        myReader = cmdDatabase.ExecuteReader();
                        MessageBox.Show("Správa odoslaná!");
                        while (myReader.Read())
                        {

                        }

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);

                    }
                }

            }
        }
    }
}

pekne to zapisuje do sql :)

len namiesto hodnoty (pc1,pc2,pc3,...) tam je System.Collec­tion.Generic.Lis
namepc už mám .ToString(); kde ešte môže byť zrada?

 
Nahoru Odpovědět 11.12.2015 12:27
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

Nejsem si jistý, ale neměl bys tu hodnotu nějak přetypovat? Takhle podle mě vkládáš objekt "row" z DataTable, proto tam nemáš hodnotu, ale System.Collec­tion...

foreach (DataRow row in ds.Tables["skupina"].Rows)
                {
                   string namepc = Convert.ToString(row["namepc"]);
                    skName.Add(namepc);
.
.
.
.
Nahoru Odpovědět 11.12.2015 22:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:

tak som to prerobil takto:

{
        using (MySqlConnection cnn = new MySqlConnection("Server=;Database=OitDB;Uid=martin;Pwd=;"))
        {
            MySqlDataAdapter da = new MySqlDataAdapter("SELECT namepc FROM skupina where nazovskup= 'mojask' ", cnn);
            DataSet ds = new DataSet();
            da.Fill(ds, "skupina");

            List<string> skName = new List<string>();
            foreach (DataRow row in ds.Tables["skupina"].Rows)
            {

                skName.Add(row["namepc"].ToString());
                string constring = "Server=;Database=OitDB;Uid=martin;Pwd=;";
                var Query = "INSERT INTO OitDB.nrp(id,pc,ip,komu,datum,predmet,sprava,skupina)VALUES('" + this.idtxt.Text + "','" + pc + "','" + this.label1.Text + "','" + this.comboBox1.Text + "','" + cas + "','" + this.textBox1.Text + "','" + this.pisat.Text + "',@name);";
                MySqlConnection conDatabase = new MySqlConnection(constring);
                MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);
                cmdDatabase.Parameters.Add("@name", MySqlDbType.VarChar).Value = string.Join("", skName.ToArray());
                MySqlDataReader myReader;


                try
                {
                    conDatabase.Open();
                    myReader = cmdDatabase.ExecuteReader();
                    MessageBox.Show("Správa odoslaná!");
                    while (myReader.Read())
                    {

                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);

                }
            }

no ale teraz mám problém s výsledkom zápisu, pretože v tabuľke skup mám 3 riadky s dátami pc1,pc2,pc3
a po zápise do tabuľky nrp mám výsledok:
riadok1-správa1-pc1
riadok2-správa1-pc1,pc2
riadok3-správa1-pc1,pc2,pc3

a potrebujem len:
riadok1-správa1-pc1
riadok2-správa1-pc2
riadok3-správa1-pc3

 
Nahoru Odpovědět 12.12.2015 9:53
Avatar
Martin Svoboda:

tak už to funguje :)

možno to niekomu pomôže

using (MySqlConnection cnn = new MySqlConnection("Server=;Database=OitDB;Uid=martin;Pwd=;"))
    {
        MySqlDataAdapter da = new MySqlDataAdapter("SELECT namepc FROM skupina where nazovskup= 'mojask' ", cnn);
        DataSet ds = new DataSet();
        da.Fill(ds, "skupina");

        List<string> skName = new List<string>();
        foreach (DataRow row in ds.Tables["skupina"].Rows)
        {

            skName.Add(row["namepc"].ToString());
            string constring = "Server=;Database=OitDB;Uid=martin;Pwd=;";
            var Query = "INSERT INTO OitDB.nrp(id,pc,ip,komu,datum,predmet,sprava,skupina)VALUES(@id,@pc,@ip,@komu,@cas,@predmet,@sprava,@name)";
            MySqlConnection conDatabase = new MySqlConnection(constring);
            MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase);

            cmdDatabase.Parameters.AddWithValue("@id", idtxt.Text);
            cmdDatabase.Parameters.AddWithValue("@pc", pc);
            cmdDatabase.Parameters.AddWithValue("@ip", label1.Text);
            cmdDatabase.Parameters.AddWithValue("@komu", comboBox1.Text);
            cmdDatabase.Parameters.AddWithValue("@cas", cas);
            cmdDatabase.Parameters.AddWithValue("@predmet", textBox1.Text);
            cmdDatabase.Parameters.AddWithValue("@sprava", pisat.Text);
            cmdDatabase.Parameters.Add("@name", MySqlDbType.VarChar).Value = row["namepc"];
            MySqlDataReader myReader;


            try
            {
                conDatabase.Open();
                myReader = cmdDatabase.ExecuteReader();
                MessageBox.Show("Správa odoslaná!");
                while (myReader.Read())
                {

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět  +1 12.12.2015 12:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 24 zpráv z 24.