Diskuze: c# local messenger
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 24 zpráv z 24.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Mám lehce zmatení babylónu. Adresát je příjemce nebo odesílatel? Zprávou se myslí patrně email ... nebo chat?
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.
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.
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.
Dobre ďakujem. Z toho odkazu mi nieje jasné ako spraviť dajaký cyklus na zápis do sql.
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
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.
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.
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
Na riadku: MySqlDataReader reader = cmdDatabase.ExecuteReader(); píše
chybu:
An unhandled exception of type 'System.InvalidOperationException' occurred
in MySql.Data.dll
A jseš si jistý že je nějaká hodnota v tom
this.comboBox3.Text
?
Resp. že ten příkaz ví, jaká tam je hodnota?
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
A sloupce a název tabulky jsou opravdu nazvané takto? Nejsou tam někde třeba velká písmena, nebo tak něco?
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
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í?
á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);
}
}
}
Mám pocit, že DataTable.Load(reader) reader uzavře po dokončení načítání. No, odkrokuj to a dívej se na stavy.
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.Collection.Generic.Lis
namepc už mám .ToString(); kde ešte môže byť zrada?
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.Collection...
foreach (DataRow row in ds.Tables["skupina"].Rows)
{
string namepc = Convert.ToString(row["namepc"]);
skName.Add(namepc);
.
.
.
.
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
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);
}
}
Zobrazeno 24 zpráv z 24.