Autor Téma: try - catch  (Přečteno 7762 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
try - catch
« kdy: 25-07-2012, 14:41:28 »
Ahoj,

potrebuji v db vytvorit tabulky, prikaz IF NOT EXIST mi nefunguje a tak jsem to vyresil na tvrdo takto:

Kód: C++ [Vybrat]
  1. if (chbNastaveniVytvoritSluopce.Checked)
  2.             {
  3.                 // pokusím se je vytvořit, pokud to skončí s vyjímkou, tak existují
  4.                 try
  5.                 {
  6.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "GPSx");
  7.                 }
  8.                 catch
  9.                 {
  10.                 }
  11.  
  12.                 try
  13.                 {
  14.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "GPSy");
  15.                 }
  16.                 catch
  17.                 {
  18.                 }
  19.                 try
  20.                 {
  21.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "Accuracy");
  22.                 }
  23.                 catch
  24.                 {
  25.                 }
  26.             }
  27.  

bohuzel je to prasarna, vim... Ale lepsi reseni mne nenapadlo... Muzete mi poradit? Aby to nebyla takovato prasarna?

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 159
  • Karma: 6
    • Verze Delphi: 7, XE6
Re:try - catch
« Odpověď #1 kdy: 25-07-2012, 15:04:15 »
Nepíšeš, pro jakou databázi to je. Ale asi ve všech se dá nějak zjistit, jestli existuje sloupec v některé tabulce. Já používám FIREBIRD a zjišťuji to takto:

Kód: [Vybrat]
select rdb$field_name from rdb$relation_fields where
(rdb$relation_name = ''TABULKA'') and (rdb$field_name = ''SLOUPEC'')

Když se vrátí řádek, existuje, když nevrátí nic, neexistuje.
Pohledej na Googlu, určitě něco najdeš.

qwertr

  • Host
Re:try - catch
« Odpověď #2 kdy: 25-07-2012, 15:19:40 »
Napriklad pre oracle 0 - stlpec neexistuje  1 - stlpec existuje


Kód: [Vybrat]
SELECT COUNT(*) FROM ALL_TAB_COLUMNS
                WHERE Upper(OWNER) = Upper('<OWNER>')
                    AND Upper(TABLE_NAME) = Upper('<TABLE_NAME>')
                    AND Upper(COLUMN_NAME) = Upper('<COLUMN_NAME>')

Offline TC

  • Příspěvků: 20
  • Karma: 0
Re:try - catch
« Odpověď #3 kdy: 25-07-2012, 15:49:07 »
Kód: C++ [Vybrat]
  1.        
  2.         void Erdt()
  3.         {
  4.             if (true)//chbNastaveniVytvoritSluopce.Checked)
  5.             {
  6.                 // pokusím se je vytvořit, pokud to skončí s vyjímkou, tak existují
  7.                 string sJmenoDB = "", sDataSource = "", sUzivatel = "", sHeslo = "";
  8.                 foreach (var col in new string[] { "GPSx", "GPSy", "Accuracy" })
  9.                     TryColumn(sJmenoDB, sDataSource, sUzivatel, sHeslo, col);
  10.  
  11.             }
  12.         }
  13.         public void TryColumn(string sJmenoDB, string sDataSource, string sUzivatel, string sHeslo, string column)
  14.         {
  15.  
  16.             try
  17.             {
  18.                 VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, column);
  19.             }
  20.             catch
  21.             {
  22.             }
  23.         }
  24.         public void VytvorSloupeckyDoDB(string sJmenoDB, string sDataSource, string sUzivatel, string sHeslo, string column)
  25.         {
  26.  
  27.         }
  28.     }
  29.  
  30.  

Zdravim

TC

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #4 kdy: 25-07-2012, 20:37:59 »
Ahoj,

potrebuji v db vytvorit tabulky, prikaz IF NOT EXIST mi nefunguje a tak jsem to vyresil na tvrdo takto:

bohuzel je to prasarna, vim... Ale lepsi reseni mne nenapadlo... Muzete mi poradit? Aby to nebyla takovato prasarna?

to už tu jednou bylo, ne? Prostě si to vytáhni z information schema (tam najdeš všechno), odkaz už jsem dával do předchozího dotazu - http://stackoverflow.com/questions/972922/add-column-to-mysql-table-if-it-does-not-exist

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #5 kdy: 25-07-2012, 20:40:19 »
Kód: C++ [Vybrat]
  1.        
  2.             try
  3.             {
  4.                 VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, column);
  5.             }
  6.             catch
  7.             {
  8.             }
  9.     }
  10.  

Tak to už je megaprasárna. Dělá se něco, co je zbytečného a selhat to může i z jiných důvodů, než že tam sloupeček není a hlavně se o tom nikdo nedozví. Když ta metoda bude prázdná, tak na to bude stejné spolehnutí :-).

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:try - catch
« Odpověď #6 kdy: 26-07-2012, 12:06:15 »
Kód: C++ [Vybrat]
  1.        
  2.             try
  3.             {
  4.                 VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, column);
  5.             }
  6.             catch
  7.             {
  8.             }
  9.     }
  10.  

Tak to už je megaprasárna. Dělá se něco, co je zbytečného a selhat to může i z jiných důvodů, než že tam sloupeček není a hlavně se o tom nikdo nedozví. Když ta metoda bude prázdná, tak na to bude stejné spolehnutí :-).

Tak promin, kazdy neni hned programator ;) A s tim IF NOT EXISTS jsem to zkousel a proste se mi to nepodarilo. Toto alespon docasne resi muj problem a jsem rad, ze to nejak funguje... Rad se ucim novym vecem, ale kdyz obcas neco nefunguje a nevim proc a to i presto, ze to delam podle rad na webu, tak jsem proste z toho podrazdenej. Pak se zeptam tady nebo na builderu a casto se dockam odpovedi, kde s clovekem opovrhujete, namisto, aby jste treba vysvetlili jak se co pouziva a proc tam zrovna tohle nejde.
A ze je to megaprasarna si uvedomuji sam, bohuzel jsem na lepsi reseni zatim neprisel. Napsal jsem sem, alespon pro zkraceni megaprasarny a s tim mi TC pomohl - DEKUJI TC. Az tady dovalcim s MySQL IF NOT EXISTS, tak to mile rad upravim :) To ze to mam zatim resene timto zpusobem neznamena, ze to je finalni reseni. 

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #7 kdy: 26-07-2012, 13:40:36 »
Tak promin, kazdy neni hned programator ;) A s tim IF NOT EXISTS jsem to zkousel a proste se mi to nepodarilo. Toto alespon docasne resi muj problem a jsem rad, ze to nejak funguje... Rad se ucim novym vecem, ale kdyz obcas neco nefunguje a nevim proc a to i presto, ze to delam podle rad na webu, tak jsem proste z toho podrazdenej. Pak se zeptam tady nebo na builderu a casto se dockam odpovedi, kde s clovekem opovrhujete, namisto, aby jste treba vysvetlili jak se co pouziva a proc tam zrovna tohle nejde.
A ze je to megaprasarna si uvedomuji sam, bohuzel jsem na lepsi reseni zatim neprisel. Napsal jsem sem, alespon pro zkraceni megaprasarny a s tim mi TC pomohl - DEKUJI TC. Az tady dovalcim s MySQL IF NOT EXISTS, tak to mile rad upravim :) To ze to mam zatim resene timto zpusobem neznamena, ze to je finalni reseni.

tak sem dej ten kód, ať je vidět, co tam děláš. Bez toho ti těžko může někdo říct, co je špatně.

A to try s prázdným catchem je učebnicový příklad toho, jak se to NEDĚLÁ, protože do budoucna ti to akorát přinese problémy a nebudeš vědět, proč to nefunguje. Vždycky tam má být alespoň zápis do logu, ať to můžeš zpětně dohledat.

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:try - catch
« Odpověď #8 kdy: 27-07-2012, 21:43:51 »
Tvorim toto:

Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using MySql.Data;
  10. using MySql.Data.MySqlClient;
  11.  
  12. namespace GeoCode_A_MySQL
  13. {
  14.     public partial class MainGPS : Form
  15.     {
  16.         public MainGPS()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.  
  21.         private void btnZacni_Click(object sender, EventArgs e)
  22.         {
  23.             GeoCode Geo = new GeoCode();
  24.             VytvoreniSloupeckuDoDB VytvorSloupce = new VytvoreniSloupeckuDoDB();
  25.             DoplnSouradnice DoplneniSouradnic = new DoplnSouradnice();
  26.  
  27.             // ulozime si obsahy textboxu
  28.             string sJmenoDB = tbNastaveniJmenoDatabaze.Text;
  29.             string sDataSource = tbNastaveniDataSource.Text;
  30.             string sUzivatel = tbNastaveniUzivatel.Text;
  31.             string sHeslo = tbNastaveniHeslo.Text;
  32.             string sTabulka = tbNastaveniJmenoTabulky.Text;
  33.  
  34.             // pokud se mají pokusit vytvorit sloupce
  35.             if (chbNastaveniVytvoritSluopce.Checked)
  36.             {
  37.                 // pokusím se je vytvořit, pokud to skončí s vyjímkou, tak existují
  38.                 try
  39.                 {
  40.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "GPSx");
  41.                 }
  42.                 catch
  43.                 {
  44.                 }
  45.  
  46.                 try
  47.                 {
  48.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "GPSy");
  49.                 }
  50.                 catch
  51.                 {
  52.                 }
  53.                 try
  54.                 {
  55.                     VytvorSloupce.VytvorSloupeckyDoDB(sJmenoDB, sDataSource, sUzivatel, sHeslo, "Accuracy");
  56.                 }
  57.                 catch
  58.                 {
  59.                 }
  60.             }
  61.  
  62.             // připojení k MySQL - je zapotřebí v preferences přidat MySQL.Data
  63.             MySqlCommand prikaz = new MySqlCommand();
  64.             MySqlConnection pripojeni = new MySqlConnection("Database=" + sJmenoDB + ";DataSource=" + sDataSource + ";UserId="
  65.                                                           + sUzivatel +";Password=" + sHeslo);
  66.             pripojeni.Open(); // otevre DB
  67.  
  68.             MySqlDataReader cteni;
  69.            
  70.             //prochazim tabulku a zaznam po zaznamu a vyhledavam kde je minimalne u jedno z GPSx, GPSy, Accuracy rovno null
  71.             prikaz.CommandText = "SELECT Adresa, ID FROM firma WHERE GPSx IS NULL OR GPSy IS NULL OR Accuracy IS NULL";
  72.  
  73.             prikaz.Connection = pripojeni;
  74.             cteni = prikaz.ExecuteReader();
  75.  
  76.             string sAdresa = "";
  77.             string sID = "";
  78.             string[] sStazenaData;
  79.            
  80.             while (cteni.Read())
  81.             {
  82.                 sAdresa = (cteni.GetString(0));
  83.                 sID = (cteni.GetString(1));
  84.                 sStazenaData = Geo.StahniSouradniceGPS(sAdresa);
  85.                 if (sStazenaData[0] != "200")
  86.                 {
  87.                     switch (sStazenaData[0])
  88.                     {
  89.                         case "500":
  90.                             MessageBox.Show("Chyba serveru.");
  91.                             break;
  92.                         case "601":
  93.                             MessageBox.Show("Adresa nebyla zadána nebo byla chybně uvedena. " + sAdresa);
  94.                             break;
  95.                         case "602":
  96.                             MessageBox.Show("Nepodařilo se najít georeferenci k uvedené adrese. " + sAdresa);
  97.                             break;
  98.                         case "603":
  99.                             MessageBox.Show("Tato adresa je legislativně chráněna a nemůže být zveřejněna. " +sAdresa);
  100.                             break;
  101.                         case "610":
  102.                             MessageBox.Show("Chybný klíč API.");
  103.                             break;
  104.                         case "620":
  105.                             MessageBox.Show("Překročen povolený limit hledání pro tento API klíč.");
  106.                             break;
  107.                         default:
  108.                             MessageBox.Show("Neznámý kód.");
  109.                             break;
  110.                     }
  111.                     if (int.Parse(sStazenaData[0]) >= 610)
  112.                     {
  113.                         break; // zastavi dalsi nacitani
  114.                     }
  115.                 }
  116.  
  117.                 DoplneniSouradnic.DoplnitSouradnice(sJmenoDB, sDataSource, sUzivatel, sHeslo, sStazenaData[2], sStazenaData[3], sStazenaData[1], sID);
  118.             }
  119.  
  120.             cteni.Close();
  121.             pripojeni.Close();
  122.         }
  123.     }
  124. }
  125.  
  126.  

snad je tento kod dostacujici... Pripadne pridam i ostatni tridy a metody...

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #9 kdy: 27-07-2012, 22:50:19 »
snad je tento kod dostacujici... Pripadne pridam i ostatni tridy a metody...

možná, ale víc by se hodil kód VytvorSloupeckyDoDB() :-)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:try - catch
« Odpověď #10 kdy: 27-07-2012, 23:18:17 »
Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MySql.Data;
  6. using MySql.Data.MySqlClient;
  7.  
  8. namespace GeoCode_A_MySQL
  9. {
  10.     class VytvoreniSloupeckuDoDB
  11.     {
  12.         public void VytvorSloupeckyDoDB(string sJmenoDB, string sDataSource, string sUzivatel, string sHeslo, string sNazevSloupecku)
  13.         {
  14.             MySqlCommand prikaz = new MySqlCommand();
  15.             MySqlConnection pripojeni = new MySqlConnection("Database=" + sJmenoDB + ";DataSource=" + sDataSource + ";UserId="
  16.                                                           + sUzivatel + ";Password=" + sHeslo);
  17.             pripojeni.Open();
  18.  
  19.             prikaz.CommandText = "ALTER TABLE firma ADD `" + sNazevSloupecku + "` DOUBLE NULL DEFAULT NULL; ";
  20.             prikaz.Connection = pripojeni;
  21.             prikaz.ExecuteNonQuery();
  22.             pripojeni.Close();
  23.         }
  24.     }
  25. }
  26.  
  27.  

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #11 kdy: 27-07-2012, 23:23:08 »
No a kde máš tu kontrolu na existenci sloupečku přes information schema, jak jsem ti už psal? Něco jako

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME='colname' AND TABLE_NAME='tablename')
  2. ALTER TABLE tablename ADD COLUMN colname double
  3.  

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:try - catch
« Odpověď #12 kdy: 28-07-2012, 00:29:08 »
No a kde máš tu kontrolu na existenci sloupečku přes information schema, jak jsem ti už psal? Něco jako

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME='colname' AND TABLE_NAME='tablename')
  2. ALTER TABLE tablename ADD COLUMN colname double
  3.  

No prave nemam, kdyz mi to nefungovalo... zkusil jsem to a skoncilo to vyjimkou

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME='GPSx' ' at line 1"

kod jsem upravil tedy takto:
Kód: MySQL [Vybrat]
  1.  public void VytvorSloupeckyDoDB(string sJmenoDB, string sDataSource, string sUzivatel, string sHeslo, string sNazevSloupecku)
  2.         {
  3.             MySqlCommand prikaz = new MySqlCommand();
  4.             MySqlConnection pripojeni = new MySqlConnection("Database=" + sJmenoDB + ";DataSource=" + sDataSource + ";UserId="
  5.                                                           + sUzivatel + ";Password=" + sHeslo);
  6.             pripojeni.Open();
  7.  
  8.             prikaz.CommandText = "IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME='GPSx' AND TABLE_NAME='firma') ALTER TABLE firma ADD COLUMN GPSx double";
  9.             prikaz.Connection = pripojeni;
  10.             prikaz.ExecuteNonQuery();
  11.             pripojeni.Close();
  12.         }
  13.  

db mam vytvorenou takto:
Kód: MySQL [Vybrat]
  1. CREATE TABLE `firma` (
  2.         `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.         `Nazev` TEXT NULL COLLATE 'utf8_czech_ci',
  4.         `Adresa` TEXT NULL COLLATE 'utf8_czech_ci',
  5.         `GPSy` DOUBLE NULL DEFAULT NULL,
  6.         `GPSx` DOUBLE NULL DEFAULT NULL,
  7.         `Accuracy` DOUBLE NULL DEFAULT NULL,
  8.         PRIMARY KEY (`ID`)
  9. )
  10. COLLATE='utf32_czech_ci'
  11.  

ty sloupcecky GPSx, GPSy, Accuracy tam byt nemusi, proto zkousim ten prikaz IF NOT...

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 566
  • Karma: 23
Re:try - catch
« Odpověď #13 kdy: 28-07-2012, 11:12:14 »
tak se podívej do dokumentace, jak se to přesně píše. V tom vlákně na stackoverflow to píšou ve tvaru if ... then ... end if, třeba to Parodie jinak nevezme

pak tam ještě psali, že information schema je podporované až od nějaké verze, na starších to nepůjde

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:try - catch
« Odpověď #14 kdy: 28-07-2012, 12:40:24 »
Mam posledni verzi MySql... tak nevim no... To nevadi, toto funguje take dobre zatim :) I kdyz je to prasarna... Samozrejme, budu hledat reseni dal a pokud neco najdu, dam to sem pro ostatni, co se placaji s MySql :)

 

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í:
Datový typ v Delphi, který má True a False: