Favicon Svethardware.cz  Svět hardware   Fórum Favicon Svetaudia.cz  Svět audia Favicon TVFreak.cz  TV Freak   Fórum Favicon Digimanie.cz  Digimanie   Fórum   Galerie Společnost oXy Online s.r.o.
Zobrazené výsledky: 1 až 8 z 8

Téma: CF1 ADO.Net provider z CF2

  1. #1
    Občasný diskutér
    Registrace
    Jun 2005
    Příspěvků
    61

    Mam ted takovy problem - prevadim aplikaci z CF1 do CF2 a bohuzel pro moji databazi (Oracle Lite) zatim neni ADO.Net provider pro CF2 - jenom pro CF1. V cele aplikaci pouzivam zakladni ADO.Net tridy a rozhrani (DbCommand, DbDataAdapter, IDbConnection, ..). Vsechno pretypovani z CF1 ADO.Net provideru na CF2 zakladni DB tridy funguje bez problemu az na DbDataAdapter. Napriklad nasledujici metoda mi hazi:

    The type 'System.Data.Common.DbDataAdapter' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Data.Common, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes'

    Kód:
    public override DbDataAdapter GetAdapter()
        {
          return (DbDataAdapter)new OracleDataAdapter();
        }
    Je to zrejme proto, ze v CF1 byl adapter v System.Data.Common assembly, zatimco v CF2 vsechno presunuli primo do System.Data a kompilator si s tim zrejme nedokaze poradit - nedokaze tu tridu dohledat. Existuje nejake reseni, jak ho donutit, aby vyhledaval i v ostatnich referencovanych assembly? Nebo budu muset v cele aplikaci pouzivat primo podedene tridy toho meho prividera? To se mi vubec nechce...
    Odpovídat lze po přihlášení

  2. #2
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Pokud je assembly slinkovana staticky, nedochazi ani ve "velkem" NF k vyvolani udalosti TypeResolve, kterou lze jinak vyuzit k nahrani typu.


    Predpokladam ale, ze tento kod je Vas - ta vyjimka Vam ale nastane kvuli tomu, ze OracleDataAdapter implementuje DbDataDadapter.

    public override DbDataAdapter GetAdapter()
    {
    return (DbDataAdapter)new OracleDataAdapter();
    }

    Bohuzel kvuli zmenam v assembly Common, nebude Vam fungovat ani redirekce verzi v configu

    &ltbindingRedirect oldVersion="2.0.0.0"
    newVersion="1.0.0.0"/&gt


    Pokud se ale dobre divam, assembly System.Data.Common jiz vubec v CNF 2.0 neni, proc tedy tu puvodni nezkusite zareferencovat?
    Odpovídat lze po přihlášení



  3. #3
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Tedy nevidim problem v tom pridat si do projektu odkaz na assembly z verze 'System.Data.Common, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes' a deployovat ji jako privatni (knihovna primo u aplikace).
    Pokud Vam nenarusi zbytek kodu, je to OK.

    Jediny problem vidim potencialne v sireni "hlaseni o o nekompatibilitet" mezi ruznymi typy COmmand apod.
    Ale pokud jste to nezkusil, prijde mi to jako nejjednossi postup, ktery vas moc casu stat nebude
    Odpovídat lze po přihlášení

  4. #4
    Občasný diskutér
    Registrace
    Jun 2005
    Příspěvků
    61

    to bohuzel kompilator nesezere, protoze potom budou tridy v namespace System.Data.Common definovany 2x - v CF2 System.Data.dll + CF1 System.Data.Common.dll

    The type 'System.Data.Common.DbDataAdapter' exists in both 'c:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\Wind owsCE\System.Data.dll' and 'c:\abc\System.Data.Common.dll'
    Odpovídat lze po přihlášení

  5. #5
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    Ano tomu rozumim, to jsou nedostatecne reference typu.

    Nepomuze Vam ale ani klicove slovo extern alias pro importu jmennych prostoru a pri kompilaci?


    Doufam, ze to projde i v CNF.

    I kdyz mozna tusim, ze u Vas je zrada jeste jinde...

    http://msdn2.microsoft.com/en-us/library/ms173212.aspx
    Odpovídat lze po přihlášení

  6. #6
    Občasný diskutér
    Registrace
    Jun 2005
    Příspěvků
    61

    aha, extern alias jsem doted neznal... vyzkousel jsem u reference na System.Data.Common.dll nastavit alias z "global" na "CF1", aby se zamezilo duplicitam trid, ale kompilator stejne hlasi chybu - tentokrat uz bez presnejsich info

    DbDataAdapter da = (DbDataAdapter)new OracleDataAdapter();

    Error 2 Cannot convert type 'Oracle.DataAccess.Lite.OracleDataAdapter' to 'System.Data.Common.DbDataAdapter'
    Odpovídat lze po přihlášení

  7. #7
    Starousedlík SMob
    Registrace
    Jan 2004
    Příspěvků
    2,017

    To jsem si mysslel, ted vam asi hapruji vazby mezi predky a potomky v puvodni hierarchii dedicnosti.

    Pak uz asi jen ta dekompilace (predpokladam, ze spolu ty 2 tgready suiuvisi) anebo napsat vlastni wrapper pro OracleDataAdapter, ktery bude forwardovat volani na OracleDataDapter.

    Mel byste tedy tridu MydataDapter, ta by byla potomkem DbDataAdapter, zapouzdrovala by OracleDataDataAdapter (drzela by si jej v privatni promenne) a veskera volani svych metod delegovala jen na metody OracleDataDataAdapter .
    Moc casu to nezabere...
    Odpovídat lze po přihlášení



  8. #8
    Občasný diskutér
    Registrace
    Jun 2005
    Příspěvků
    61

    Dik za tip s wrapperem - mozna mi nakonec nic jineho nezbyde

    thready souvisi - ILASM mne napadlo az pozdeji a jelikoz je to sirsi tema, tak jsem to dal do noveho threadu...
    Odpovídat lze po přihlášení