konto usunięte

Temat: Prośba o pomoc w prostej aplikacji Mysql

NieaktualneTen post został edytowany przez Autora dnia 04.03.15 o godzinie 21:38

konto usunięte

Temat: Prośba o pomoc w prostej aplikacji Mysql

looknij w ten kod, powinien pokazać ci mniej więcej jak to zrobić żeby miało to sens
1. po co masz pod każdym guzikiem prawie ten sam kod? hmm
2. czemu UPDATE chcesz wykonać tak jak SELECT? UPDATE nie zwraca wyniku, dlatego masz do tego inną metodę
3. czemu kleisz SQL-a? skoro masz parametry - obie metody masz w przykładzie


using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
private const string MyConnection = "datasource=localhost;port=3306;username=root;password=kalafior;database=baza1568_12";

private MySqlConnection MyConn = new MySqlConnection(MyConnection);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
try
{
string sSql = string.Format("select nr_sprawy,rok,nazwa_firmy,notatka,zakonczono_przez_dzial,realizacja from sprawy where id_dyrektora='{0}';", this.textBox1.Text);

dataGridView1.DataSource = GetDataFromSql(sSql);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void button2_Click(object sender, EventArgs e)
{
try
{
string sQuery = "update sprawy set zakonczono_przez_dzial='1' where id_dyrektora=@id_dyrektora AND rok=@rok AND realizacja='1';";

Dictionary<string, string> parms = new Dictionary<string, string>();

parms.Add("id_dyrektora", this.textBox1.Text);
parms.Add("rok", this.rokBox.Text);

ExecuteSql(sQuery, parms);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void ExecuteSql(string sSql, Dictionary<string, string> parms)
{
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = MyConn;
cmd.CommandText = sSql;
cmd.Prepare();

foreach (var parm in parms)
{
cmd.Parameters.AddWithValue(string.Format("@{0}", parm.Key), parm.Value);
}

cmd.ExecuteNonQuery();
}

private DataTable GetDataFromSql(string sSql)
{
if (MyConn.State != ConnectionState.Open)
{
MyConn.Open();
}
MySqlCommand MyCommand = new MySqlCommand(sSql, MyConn);
MySqlDataAdapter MyAdapter = new MySqlDataAdapter(MyCommand);
DataTable dTable = new DataTable();
MyAdapter.Fill(dTable);
return dTable;
}
}
}
Ten post został edytowany przez Autora dnia 04.03.15 o godzinie 22:09
Grzegorz Kot

Grzegorz Kot Programista .NET

Temat: Prośba o pomoc w prostej aplikacji Mysql

1. Piszemy kod tak aby był uniwersalnych (unikamy duplikatów w przypadku gdzie da się to w prosty sposób parametryzować)
2. Update - ExecuteNonQuery; Select - ExecuteReader, ExecuteScalar
3. Używamy parametrów lub tworzymy obiekt rekordu - działa szybciej. Unikamy przy tym wszelkich sql injection.

Przemysław, dodaj do swojego kodu wykorzystanie "using" pozwoli to na bezpieczniejsza pracę pod względem alokacji pamięci i złożył bym nieco kod, nie jest tu potrzebne aż tyle linijek.

funcja(){
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = MyConn;
cmd.CommandText = sSql;
cmd.Prepare();

foreach (var parm in parms)
{
cmd.Parameters.AddWithValue(string.Format("@{0}", parm.Key), parm.Value);
}

cmd.ExecuteNonQuery();
}

proponuje

funkcja()
{
using(MySqlCommand cmd = MyConn.CreateCommand())
{
cmd.CommandText = @"select *......";
foreach (var parm in parms)
{
cmd.Parameters.AddWithValue(string.Format("@{0}", parm.Key), parm.Value);
}
cmd.ExecuteNonQuery();
}

}

Oczywiście jeśli baza obsługuje transakcje, polecam dorzucić transakcje przy wszelkich Update,Delete.

Oczywiście w przypadku niektórych baz danych wywoływanie metod Execute mija się z celem, czasem wyrzuca błąd lub też zwraca zero rekordów pomimo, że w dowolnym IDE do baz danych dostajemy wynik warto wtedy skorzystać z DataAdaptera - przypadek też może działać na odwrót. Ten post został edytowany przez Autora dnia 06.03.15 o godzinie 12:31



Wyślij zaproszenie do