Така, ето какво е положението:
- стар код от .NET 3.5
- използва Oracle .NET 2 provider
- DataSet-и
- трябва да се подкара спешно, а има налично само VS 2013
Резултатът е: Exception of type System.Data.Design.InternalException was thrown при отваряне на dataset и при build на проекта.
Повечете предложения за решения се ограничаваха до това, че в xsd файла има директни референции към Oracle Connection String и съответно те причиняват проблем. Това, не беше случая при мене, макар и да имаше доста коментари по Интернет, че решава проблема.
Почти бях изпаднал в безизходица докато не стигнах до http://blogs.msdn.com/b/psssql/archive/2011/04/21/conversion-issues-moving-from-vs-2005-to-vs-2008.aspx. Макар и подобен проблем, пътят до решението беше описан методично и точно! InternalException в System.Data.Design може да се появи само в два случая:
- Cannot find provider factory named {0}
- More than one data row for provider named {0}
Аха! И двата имаха нещо общо с provider и то вероятно Oracle-ския. Нещата започнаха да се избистрят – ODP.NET беше инсталиран, но само за 2.0, а VS 2013 използва .NET 4.5 и съответно друг CLR и не може да го намери design time.
И наистина в C:\windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config има
1 2 |
<configSections> <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> |
и
1 2 3 |
<system.data> <DbProviderFactories> <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342" /> |
Ако тези секции се преместят и в machine.config за .NET 4 всичко, донякъде изненадващо, върви точно.