Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

CF1 ADO.Net provider z CF2

Buthrakaur (61)|18.8.2006 09:14
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'

[CODE]public override DbDataAdapter GetAdapter()
{
return (DbDataAdapter)new OracleDataAdapter();
}[/CODE]

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... :(
RStein (2012)|28.8.2006 12:07
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 :(

<bindingRedirect oldVersion="2.0.0.0"
newVersion="1.0.0.0"/>


Pokud se ale dobre divam, assembly System.Data.Common jiz vubec v CNF 2.0 neni, proc tedy tu puvodni nezkusite zareferencovat?
RStein (2012)|28.8.2006 12:13
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
Buthrakaur (61)|28.8.2006 12:28
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\WindowsCE\System.Data.dll' and 'c:\abc\System.Data.Common.dll'
RStein (2012)|28.8.2006 12:44
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
Buthrakaur (61)|28.8.2006 13:01
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'
RStein (2012)|28.8.2006 13:17
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...
Buthrakaur (61)|28.8.2006 13:23
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...