Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Miroslav
Člen
Avatar
Miroslav:14.2.2020 14:22

Zdravím ,

Předem upozorňuji , že jsem amatér.

Mám problém s úpravou záznamů v databázi ,pokud zadám dvouslovný výraz do txtBoxu , tak databáze vyhodnotí mezeru mezi slovy jako oddělovač , a vyhodí mi chybu při pokusu o Update.

Otázka :

Jak deklaruji , že mezera není oddělovač záznámu?

pro ukázku kód Update relace pro zápis:

case "UPDATE":
                       string[] tiv = query.Substring(query.LastIndexOf("VALUES") + 7).Split(new char[4] { '(', ',','\'', ')' }, StringSplitOptions.None);

                       if (query.LastIndexOf("WHERE") > -1)
                       {
                           if (QueryArray[4] == "VALUES")
                           {
                               string[] tcon = QueryArray[7].Split('=');
                               string[] tic = QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
                               ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), StringArrayToString(tic), tcon[0], tcon[1]);
                           }
                           else
                           {
                               string[] tcon = QueryArray[3].Split('=');
                               ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), null, tcon[0], tcon[1]);
                           }
                       }
                       else
                       {
                           if (QueryArray[4] == "VALUES")
                           {
                               string[] tic = QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
                               ValueObj = UpdateRecord(QueryArray[2], DataBase, StringArrayToString(tiv), StringArrayToString(tic));
                           }
                           else
                           {
                               ValueObj = UpdateRecord(QueryArray[2], DataBase, StringArrayToString(tiv), null);
                           }
                       }

Problém je , že když dám mezeru v txtBoxu , tak se mi rozhodí pořadí příkazů v "QueryArray" protože ta mezera mi rozdělí řádek a zapíše se nový.

Nevím jestli je to pochopitelné, ale lépe se asi nevyjádřím :)

Předem děkuji za rady

 
Odpovědět
14.2.2020 14:22
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:14.2.2020 14:52

Nevim, jak se to dela v c#, ale obvykle se hodnoty escapuji.
sloupce a nazvy tabulek jako escapeKey(), hodnoty jako escapeValue().

UPDATE customers SET address = 'Pune' WHERE id = 6
UPDATE `customers` SET `address` = 'Pune' WHERE `id` = 6 -- mysql

customers, address, id jsou keys. Nesmi obsahovat text ` a tento text je nutne odstranit nebo escapovat
'Pure', 6 jsou hodnoty, values. Textova hodnota nesmi obrahovat apostrof a ten musis escapovat. ciselna se pise bez apostrofu, ale mnoho db to veme i v apostrofech. Ciselna hodnota nesmi mit v sobe text ani jiny znak. Ty musis odstranit.

UPDATE `customers` SET `address` = 'P\'u\'n\'e' WHERE `id` = 6 -- mysql apostrofy.

V pripade formatu csv je oddelovac sloupcu carka ',' Zadny dalsi text nesmi obsahovat carku. Uzavreji stringu byva dvojita uvozovka ". zavreny string carku muze obsahovat. Text uvnitr nesmi obsahovat uvozovku. Priklad (excel dokaze exportovat do csv, ale oddelovac je strednik):

"aaa","bbb","ccc"
0, 5 , "text,text"
0, 5 , "te""xt,te""xt" - apostrof se zdvojuje

Cili, ve tvem pripade, bud pouzivas sql-driver a ten ma moznost escapovani pres nejakou funkci nebo to dela dokonce sam v pripade parametru. A nebo si to musis najit, jaka pravidla pro excapovani pouziva tvuj sql driver a udelat to sam.
Ve tvem pripade by mohlo stacit mozna pridat tam zpetne lomitko

UPDATE customers SET address = 'Pune' WHERE id = 6
"UPDATE customers SET address = '" + "Pune" + "' WHERE id = 6" - spojovani retezcu (ve VS mozna pomoci &)
"UPDATE customers SET address = '" + "Pu'ne" + "' WHERE id = 6" - apostrof tady by to rozhodil
"UPDATE customers SET address = 'Pu' ne' WHERE id = 6" - apostrof tady by to rozhodil, platne by bylo address = 'Pu'
x = "Pu\'ne" -- takto nebo dve lomitka
x = "Pu\\'ne"
"UPDATE customers SET address = '" + x + "' WHERE id = 6" - apostrof tady by to rozhodil

Ty mezery, mozna tam nemas apostrofy pro string. Mezera by sql prikaz nemela narusit.

 
Nahoru Odpovědět
14.2.2020 14:52
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Miroslav
Jaroslav Smrž:14.2.2020 15:48

Nepomohlo by jen něco typu

string[] QueryArray = new string[];
Nahoru Odpovědět
14.2.2020 15:48
/* Life runs on code */
Avatar
Miroslav
Člen
Avatar
Miroslav:14.2.2020 19:36

Ten záznam mam takto:

//Update
        public static bool UpdateRecord(string tblName, string dbName, string iValues, string iColumns = null, string cField=null, string cValue=null)
        {
            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
                return false;
            else
            {
                FileStream fsr = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                FileStream fsw = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                StreamWriter sw = new StreamWriter(fsw);
                StreamReader sr = new StreamReader(fsr);
                fsw.Seek(0, SeekOrigin.End);
                string tCol = sr.ReadLine();
                string[] ColsArray = tCol.Split(new char[3] { '├', '┤', '│' }, StringSplitOptions.RemoveEmptyEntries);

                sw.Write(tCol);

                string[] iColumnsArray = null;
                int TempiCols = 0;
                string modifiedRow = "";
                string[] iValuesArray = iValues.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                TempiCols = iValuesArray.Length;

                if (iColumns != null)
                {
                    iColumnsArray = iColumns.Split(',');
                    TempiCols = iColumnsArray.Length;
                }



                if (cField != null || cValue != null)
                {
                    int cfi = Array.IndexOf(ColsArray, cField);
                    while (!sr.EndOfStream)
                    {
                        string TempStr = sr.ReadLine();
                        string[] RowArray = TempStr.Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);
                        if (RowArray[cfi].Trim() == cValue.Trim())
                        {
                            modifiedRow = "";

                            int k = 0;

                            for (int i = 0; i < ColsArray.Length; i++)
                            {
                                if (iColumnsArray != null)
                                {
                                    for (int j = 0; j < TempiCols; j++)
                                    {
                                        if (ColsArray[i] == iColumnsArray[j])
                                        {
                                            modifiedRow += iValuesArray[j]+"~";
                                            k++;
                                            break;
                                        }
                                        else
                                        {
                                            if (j == TempiCols - 1)
                                            {
                                                modifiedRow += RowArray[i] + "~";
                                                break;
                                            }
                                        }
                                    }
                                }

                            }



                            string[] TempcValues = modifiedRow.Split('~');

                            string TempModStr = "└";
                            for (int j = 0; j < TempcValues.Length; j++)
                            {
                                if (TempcValues[j].Trim() == "")
                                    TempcValues[j] = "■";
                                if (j < TempcValues.Length - 1)
                                {
                                    TempcValues[j] += "│";
                                }
                                TempModStr += TempcValues[j];
                            }
                            TempModStr += "┘";

                            TempStr = TempModStr;
                        }
                        sw.Write(sw.NewLine + TempStr);

                    }
                }

                else
                {
                    while (!sr.EndOfStream)
                    {
                        string TempStr = sr.ReadLine();
                        string[] RowArray = TempStr.Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);

                            modifiedRow = "";

                            int k = 0;
                            for (int i = 0; i < ColsArray.Length; i++)
                            {
                                for (int j = 0; j < TempiCols; j++)
                                {
                                    if (k<=iValuesArray.Length-1)
                                    {
                                        modifiedRow += iValuesArray[j]+"~";
                                        k++;
                                        break;
                                    }
                                    else
                                    {
                                        if (j <= TempiCols - 1)
                                        {
                                            modifiedRow += RowArray[i]+"~";
                                            break;
                                        }
                                    }
                                }
                            }

                            //dale;
                            string[] TempcValues = modifiedRow.Split('~');

                            string TempModStr = "└";
                            for (int j = 0; j < TempcValues.Length; j++)
                            {
                                if (TempcValues[j].Trim() == "")
                                    TempcValues[j] = "■";
                                if (j < TempcValues.Length - 1)
                                {
                                    TempcValues[j] += "│";
                                }
                                TempModStr += TempcValues[j];
                            }
                            TempModStr += "┘";

                            TempStr = TempModStr;

                        sw.Write(sw.NewLine + TempStr);
                    }
                }

                sw.Close();
                sr.Close();
                fsr.Close();
                fsw.Close();
                File.Copy(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", true);
                File.Delete(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp");
                return true;
            }
        }

Asi to bude někde tu, třeba něco doplnit nebo tam mám něco navíc...Nevím
A děkuji za rady...:)

Editováno 14.2.2020 19:38
 
Nahoru Odpovědět
14.2.2020 19:36
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 4 zpráv z 4.