LINQ TO SQL   zodpovězená otázka

C#, SQL, LINQ

Zdravim,

jsem zacatecnik a chtel jsem vas poprosit o radu jak nacitat dotazy na vyhledavani v databazi treba z textboxu.

uzivatel treba napise do textboxu toto:

from a in dc.GetTable<Order>()

select a;

a v databazi se to vyhleda.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ne, takhle kreténsky to nepůjde. Zřejmě nevíte co je to LINQ to SQL a považujete to za normální SQL příkazy. Něco takového co zde máte naznačeno by vyžadovalo dynamickou kompilaci kódu pomocí Reflection a na to rovnou zapomeňte. Rovněž provádět SQL příkazy co zadá uživatel je hovadina, protože tam může zadat třeba DROP TABLE.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Doporučil bych Vám někde nastudovat aspoň jednoduché základy LINQ. Co se týká provedení selektu, nejjednodušší demonstrativní příklad by mohl být takový, že do aplikace vložíte DataClasses.dbml do kterého přetáhnete ze Server Exploreru celou databázi včetně procedur(z toho se vytvoří objektový model). Pak není nic jednoduššího, než ve stránce vytvořit instanci DataClasses dc = new DataClasses() a poté napsat nějaký LINQ dotaz či zavolat uloženou proceduru a té předat jen parametr z vašeho TextBoxu.

Co se týká vkládání T-SQL příkazů z textboxu, tak k tomu se vyjídřil už pan Linhart myslím dosti...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mockrá děuji za ochotu. Linq jsem v základních dotazech již používal ale vždy se jednalo jen o učitý dotaz který se nepřebíral z textboxu.Kdyz vezmu treba dotaz:

DataClasses1DataContext db = new DataClasses1DataContext();

var q = from a in db.GetTable<Customer>() 
                    where a.FirstName.StartsWith("A") 
                    select a;

Tak jak získat dotaz z textboxu aby byl typu var? Kdyz to vezmu jako text tak to bude typu Sring a to je hovadina.

Děkuji za radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už tu o tom bolo niečo povedané.

S LINQ požiadavkami z textboxu vám neporadím, ale ak chcete spúšťať bežné sql požiadavky, ktoré sú z textboxu, tak sa pripojíte k databáze priamo(bez použitia LINQ to SQL).Pre Microsoft SQL Server je to SqlConnection a SqlCommand z namespace System.Data.Sql. Nachádza sa v assembly System.Data .

Ale pokúste sa to vyriešiť akýmkolvek iným spôsobom, aký je dostupný.Minimálne by ste mal vymedziť určité príkazy, ktoré sú povolené, a nespúšťať nič iné.Blokovať určité príkazy nepostačuje, lebo čo ak na niektorý zabudnete?

Ak necháte voľne bez kontroly spúšťať sql požiadavky na databáze, tak ako tu už zaznelo, môžu vám tam napísať napríklad "DROP TABLE Users".

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky za názor ale přesto bych potřeboval poradit z dotazovanim pomoci linq.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jedine ak za behu vygenerujete kód, ktorý vykoná ten príkaz, zabalíte ho do funkcie a tú do modulu a skompilujete.Napríklad tým, že to uložíte do súboru a spustíte prekladač C#. Ten nájdete v zložke vašej verzie .net frameworku, pre 3.5 je to c:\windows\microsoft.net\framework\v3.5\csc.exe .Parametre zistíte spustením prekladača s parametrom -? .

A nezabudnite vymedziť príkazy, ktoré sú povolené a zvyšné proste nespustiť.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1. Pro ohraničování kusů kódu používejte tlačítko VB Code, aby se kód zvýraznil a obarvil.

2. Typ var neexistuje, zjistěte si, co vlastně používáte. Var je jenom zkratka pro lenochy, aby nemusely vypisovat skutečný datový typ, protože v tomto případě si ho umí domyslet kompilátor sám. Ve skutečnosti bude typ něco jako IQueryable<Customer>.

3. Kód, který napíšete v C#, se kompiluje před tím, než se spustí. Pokud chcete, aby člověk mohl psát kód do TextBoxu (jakkoliv úchylný požadavek to je), musíte buď napsaný kód zkompilovat pomocí C# kompilátoru do separátní assembly, tu dynamicky načíst do paměti a spustit, s tím, že musíte dát sakra velký pozor, aby uživatel do Textboxu napsal opravdu jenom LINQ dotaz a nic jiného, co by třeba smazalo data z disku atd.

Anebo napsat parser na LINQ dotazy a nějak je interpretovat, nejlépe asi stavět expression tree.

Obě tyto možnosti jsou ale komplikované, první je o trochu jednodušší, ale je tam velké bezpečnostní riziko.

Na co takovouhle věc vůbec potřebujete?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď na úrovni odboníka.

Applikace pro kterou to potřebuji bude měřit čas potřebný pro vykonání operace nad databází (select, inser, delete atd...) a to pomocí přístopových metod Linq to sql, ado.net a popřípadě entity framework (ado.net).

Aplikaci nebude používat neznalý uživatel, ale člověk který bude umět používat jak dotazy sql tak linq.

Ta první varianta i přes bezpečnostní riziko vypadá vcelku dobře, neznáte nějaký odkaz kde bych se o tom mohl dočíst víc.

Mnohokrát děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak proste zoberiete nejaký pripravený kód a doňho vložíte ten linq požiadavok. Bude potrebná jedna funkcia správneho návratového typu a argumentov, do nej vložíte return a linq požiadavok z textboxu.Tá ale musí byť v triede(najlepšie static funkcia v static triede) a tú by ste ešte mali dať do namespace.Skompilujete cez System.CodeDom alebo to vložíte do súboru a zavoláte csc.exe z .net frameworku.Následne cez reflection načítať do pamäte, zavolať funkciu a už iba zobraziť výsledok.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste uklidnit styl, kterým píšete Vaše příspěvky.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback