CF1 ADO.Net provider z CF2
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... :(
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... :(
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?
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?
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
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
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'
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'
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
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
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'
DbDataAdapter da = (DbDataAdapter)new OracleDataAdapter();
Error 2 Cannot convert type 'Oracle.DataAccess.Lite.OracleDataAdapter' to 'System.Data.Common.DbDataAdapter'
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...
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...