Autor Téma: Select a Update v jednom prikazu?  (Přečteno 3769 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Select a Update v jednom prikazu?
« kdy: 23-07-2012, 00:24:45 »
Zdravim,

mam dotaz, je mozne provest SELECT a UPDATE v jednom dotazu?

Tedy prochazim DB zaznam po zaznamu a vyhledavam zaznamy, kde je jeden ze 3 sloupcu NULL. Paklize ano, chci z internetu stahnout GPS souradnice a doplnit je do techto sloupecku.

Zkousim to takto:

Kód: C++ [Vybrat]
  1. prikaz.CommandText = "SELECT Adresa FROM firma WHERE GPSy IS NULL OR GPSy IS NULL OR Accuracy IS NULL";
  2.  
  3.             prikaz.Connection = pripojeni;
  4.             cteni = prikaz.ExecuteReader();
  5.  
  6.             string sAdresa = "";
  7.             string[] sStazenaData;
  8.  
  9.             while (cteni.Read())
  10.             {
  11.                 sAdresa = (cteni.GetString(0));
  12.                 sStazenaData = Geo.StahniSouradniceGPS(sAdresa);
  13.                 prikaz.CommandText = "UPDATE firma SET GPSx=1, GPSy=2, Accuracy=123";
  14.                 prikaz.ExecuteReader();
  15.             }
  16.  
  17.             cteni.Close();
  18.             pripojeni.Close();
  19.  

bohuzel nemohu provadet 2 prikazy v jednom dotazu, nebo vite jak to myslim... Proto to potrebuji dat nejak do jednoho, nebo nejaky jiny napad?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2877
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:Select a Update v jednom prikazu?
« Odpověď #1 kdy: 23-07-2012, 07:45:05 »
Nestačí Ti hodiť podmienku Select-u do Update?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:Select a Update v jednom prikazu?
« Odpověď #2 kdy: 23-07-2012, 08:17:16 »
Samozřejmě by šlo "provádět dva příkazy v jednom dotazu". Jenže ty nemáš případ pro "dva příkazy v jednom dotazu", ty máš případ pro "dotaz, potom akce mimo DB, a na základě té akce update". Kdybys chtěl dva příkazy v jednom dotazu, tak to uděláš vhodnou sestavou CASE:
Kód: SQL [Vybrat]
  1. UPDATE tabulka
  2. SET pole1=CASE WHEN pole1 IS NOT NULL THEN pole1 ELSE vypocethodnotypole1(...) END,
  3.     pole2=CASE WHEN pole2 IS NOT NULL THEN pole2 ELSE vypocethodnotypole2(...) END
  4. WHERE pole1 IS NULL OR POLE2 IS NULL

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Select a Update v jednom prikazu?
« Odpověď #3 kdy: 23-07-2012, 09:35:04 »
Zdravim,

mam dotaz, je mozne provest SELECT a UPDATE v jednom dotazu?

Tedy prochazim DB zaznam po zaznamu a vyhledavam zaznamy, kde je jeden ze 3 sloupcu NULL. Paklize ano, chci z internetu stahnout GPS souradnice a doplnit je do techto sloupecku.

Zkousim to takto:

Kód: C++ [Vybrat]
  1. prikaz.CommandText = "SELECT Adresa FROM firma WHERE GPSy IS NULL OR GPSy IS NULL OR Accuracy IS NULL";
  2.  
  3.             prikaz.Connection = pripojeni;
  4.             cteni = prikaz.ExecuteReader();
  5.  
  6.             string sAdresa = "";
  7.             string[] sStazenaData;
  8.  
  9.             while (cteni.Read())
  10.             {
  11.                 sAdresa = (cteni.GetString(0));
  12.                 sStazenaData = Geo.StahniSouradniceGPS(sAdresa);
  13.                 prikaz.CommandText = "UPDATE firma SET GPSx=1, GPSy=2, Accuracy=123";
  14.                 prikaz.ExecuteReader();
  15.             }
  16.  
  17.             cteni.Close();
  18.             pripojeni.Close();
  19.  

bohuzel nemohu provadet 2 prikazy v jednom dotazu, nebo vite jak to myslim... Proto to potrebuji dat nejak do jednoho, nebo nejaky jiny napad?

Můžeš, ale tady máš mezitím nějakou akci mimo db. V tomhle bych problém neviděl, prostě ten update dělej v rámci nové connectiony. Taky máš myslím blbě to, že do commandu nastavuješ UPDATE a pak voláš ExecuteReader, měl bys volat spíš něco jako ExecuteNonQuery. Ale stejně to nemůžeš dělat v rámci stejné connection, z které chceš pak dále číst.

Offline mira

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
Re:Select a Update v jednom prikazu?
« Odpověď #4 kdy: 23-07-2012, 10:50:53 »
Asi bych to zkusil řešit přes DataAdapter. Načíst si výsledky dotazu nad tabulkou firem do DataTable, provézt potřebné změny a pak to tam všechno najednou poslat pomocí DataAdapter.Update()

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:Select a Update v jednom prikazu?
« Odpověď #5 kdy: 23-07-2012, 13:42:54 »
mira: Jak to myslis prosim? Mohl bys mi to tu ukazat?

Mi.Chal.: zkousim to tedy takto:

Kód: C++ [Vybrat]
  1. while (cteni.Read())
  2.             {
  3.                 sAdresa = (cteni.GetString(0));
  4.                 sStazenaData = Geo.StahniSouradniceGPS(sAdresa);
  5.                 MessageBox.Show(string.Join(",",sStazenaData));
  6.                
  7.                
  8.                 MySqlCommand prikaz2 = new MySqlCommand();
  9.                 MySqlConnection pripojeni2 = new MySqlConnection("Database=" + sJmenoDB + ";DataSource=" + sDataSource + ";UserId="
  10.                                                           + sUzivatel + ";Password=" + sHeslo);
  11.                 pripojeni2.Open();
  12.  
  13.                 MySqlDataReader upravaDat;
  14.                 prikaz2.CommandText = "UPDATE firma SET GPSx=1, GPSy=2, Accuracy=123 WHERE Adresa=" + sAdresa;
  15.                 prikaz2.Connection = pripojeni2;
  16.                 upravaDat = prikaz.ExecuteNonQuery();
  17.                 pripojeni2.Close();
  18.             }
  19.  
  20.             cteni.Close();
  21.             pripojeni.Close();
  22.  

bohuzel se na radku
Kód: C++ [Vybrat]
  1. upravaDat = prikaz.ExecuteNonQuery()
setkavam s errorem : "Error 1 Cannot implicitly convert type 'int' to 'MySql.Data.MySqlClient.MySqlDataReader'" a kdyz to upravim na MySqlDataAdapter, tak to pise to same, jen na konci je Adapter...

Pepak: Fungovalo by toto i v mem pripade? Teda, ze bych mezi tim vykonal nejakou mimodatabazovou akci?

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:Select a Update v jednom prikazu?
« Odpověď #6 kdy: 23-07-2012, 13:51:55 »
Pokud MySQL umí UDF (user-defined functions), tak by mělo.

Offline mira

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
Re:Select a Update v jednom prikazu?
« Odpověď #7 kdy: 23-07-2012, 14:26:46 »
Nevím, jak se připojuješ k databazi, pokud by to bylo přes ODBC, tak by to mohlo vypadat třeba takto:

Kód: C++ [Vybrat]
  1.             using (OdbcDataAdapter adapter = new OdbcDataAdapter(selectQuery, connection))
  2.             {
  3.                 using (DataTable table = new DataTable())
  4.                 {
  5.                     adapter.Fill(table);
  6.  
  7.                     string address;
  8.                     foreach (DataRow row in table.Rows)
  9.                     {
  10.                         // zde upravit data
  11.                         address = row["address"].ToString();
  12.                        
  13.                         // Geo.StahniSouradniceGPS(address);
  14.                        
  15.                         row["GPSx"]     = 1;
  16.                         row["GPSy"]     = 2;
  17.                         row["Accuracy"] = 123;
  18.                     }
  19.  
  20.                     // poslat upravena data zpet do DB
  21.                     adapter.Update(table);
  22.                 }
  23.             }
  24.  

Jinak je to popsáno např. zde http://msdn.microsoft.com/en-us/library/33y2221y(v=vs.80).aspx
« Poslední změna: 23-07-2012, 14:33:25 od mira »

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Select a Update v jednom prikazu?
« Odpověď #8 kdy: 23-07-2012, 19:55:45 »
bohuzel se na radku
Kód: C++ [Vybrat]
  1. upravaDat = prikaz.ExecuteNonQuery()
setkavam s errorem : "Error 1 Cannot implicitly convert type 'int' to 'MySql.Data.MySqlClient.MySqlDataReader'" a kdyz to upravim na MySqlDataAdapter, tak to pise to same, jen na konci je Adapter...

taky si to chce přečíst, co ta metoda dělá. Vrací počet upravených záznamů, takže to nepůjde přiřadit do datareaderu. V podstatě ten result na nic nepotřebuješ.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: