Hi Merwed,
Versuchs mal mit einer Extention. Ich hab das f?r VB.Net gemacht, und den Code mit einem Tool auch nach C# convertiert.
VB.Net:
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports System.Data.Common
Module MyExtention
''' <summary>
''' Extention zur Erm?glichung des Zugriffs auf die Protected Property "DbProviderFactory"
''' </summary>
''' <param name="aConnection">The DbConnection to get the DBProviderFactory from.</param>
''' <returns>DbProviderFactory Property.</returns>
''' <remarks></remarks>
<Extension()>
Public Function getDBFactory(ByVal aConnection As DbConnection) As DbProviderFactory
If aConnection Is Nothing Then Return Nothing
Dim pinfo As PropertyInfo = GetType(DbConnection).GetProperty("DbProviderFactory", BindingFlags.Instance Or BindingFlags.NonPublic)
If pinfo IsNot Nothing Then
Try
Return CType(pinfo.GetValue(aConnection, {}), DbProviderFactory)
Catch ex As Exception
Return Nothing
End Try
Else
Return Nothing
End If
End Function
End Module
C#:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Data.Common;
static class MyExtention
{
/// <summary>
/// Extention zur Erm?glichung des Zugriffs auf die Protected Property "DbProviderFactory"
/// </summary>
/// <param name="aConnection">The DbConnection to get the DBProviderFactory from.</param>
/// <returns>DbProviderFactory Property.</returns>
/// <remarks></remarks>
[Extension()]
public static DbProviderFactory getDBFactory(DbConnection aConnection)
{
if (aConnection == null)
return null;
PropertyInfo pinfo = typeof(DbConnection).GetProperty("DbProviderFactory", BindingFlags.Instance | BindingFlags.NonPublic);
if (pinfo != null) {
try {
return (DbProviderFactory)pinfo.GetValue(aConnection, {
});
} catch (Exception ex) {
return null;
}
} else {
return null;
}
}
}
Dies ist mein erster Post, hoffentlich funktioniert die Formatierung.
Viele Gr??e
>> On Monday, January 19, 2009 10:58 AM Albert Andersson wrote:
>> Merwed schrieb:
>>
>> Was möchtest du genau Erreichen?
>>
>> Im SqlClient findest du das
>>
>> SqlCommand
>>
>> Diesem kannst du die Connection mitgeben und ausserdem das Query,
>>
>> SqlConnection SqlCon = new SqlConnection(ConnectionString);
>> SqlCommand SqlCmd = new SqlCommand();
>>
>> SqlCmd.Connection = SqlCon;
>> SqlCmd.CommandText = "select * from ..."
>>> On Monday, January 19, 2009 1:09 PM Merwed wrote:
>>> Ein Objekt verfügt über eine DbConnection, die von außen übergeben wurde und
>>> benötigt nun einen DbDataAdapter um Daten aus der Datenbank (deren Provider
>>> unbekannt ist) in ein DataTable-Objekt zu transferieren.
>>>
>>>
>>> Das Problem bestand ja genau darin, dass der Provider nicht bekannt ist!
>>>
>>> Inzwischen mach ich das so:
>>>
>>> public static DbProviderFactory GetFactory(DbConnection Connection) {
>>>
>>> DataTable dt = DbProviderFactories.GetFactoryClasses();
>>>
>>> foreach(DataRow r in dt.Rows) {
>>> DbProviderFactory f = DbProviderFactories.GetFactory(r);
>>> DbConnection c = f.CreateConnection();
>>> if(c.GetType().FullName == Connection.GetType().FullName)
>>> return f;
>>> }
>>>
>>> return null;
>>> }
>>>> On Monday, January 19, 2009 2:11 PM Peter Götz wrote:
>>>> Hallo Merwed,
>>>>
>>>>
>>>> Das könnte z.B. wahlweise eine SqlConnection,
>>>> eine OleDbConnection oder eine OraclConnection
>>>> sein.
>>>>
>>>>
>>>> Der wiederum könnte enstpr. des Typs der DbConnection
>>>> ein SqlDataAdapter, ein OleDbAdapter oder ein
>>>> OracleDataAdapter sein.
>>>>
>>>>
>>>> nachdem Du die DbConnection mit
>>>> Dim Cnn as SqlConnection = DirectCast (DbConnection, SqlConnection)
>>>> oder
>>>> Dim Cnn = DirectCast (DbConnection, OleDbConnection)
>>>> oder
>>>> Dim Cnn = DirectCast (DbConnection, OleDbConnection)
>>>>
>>>> in den tatsächlichen Typ umgewandelt hast, kannst Du bei
>>>> der OleDbConnection auf die Eigenschaft Provider zugreifen.
>>>>
>>>> DirectCast(Cnn, OleDbConnection).Provider
>>>>
>>>> Bei SqlConnection und OracleConnection ist Provider ohnehin
>>>> klar.
>>>>
>>>> Der nachfolgende Code sollte das Prinzip
>>>> veranschaulichen:
>>>>
>>>> Select Case True
>>>> Case (TypeOf Cnn Is SqlConnection)
>>>> DA = New SqlDataAdapter
>>>>
>>>> Case TypeOf Cnn Is OleDbConnection
>>>> DA = New OleDbDataAdapter
>>>>
>>>> Case TypeOf Cnn Is OracleConnection
>>>> DA = New OracleDataAdapter
>>>> End Select
>>>>
>>>> Gruß aus St.Georgen
>>>> Peter Götz
>>>>
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
>>>>> On Monday, January 19, 2009 3:26 PM Stefan Falz [MVP] wrote:
>>>>> Hallo Merwed,
>>>>>
>>>>> "Merwed" schrieb:
>>>>>
>>>>>
>>>>>
http://msdn.microsoft.com/de-de/library/system.data.common.dbconnection.dbproviderfactory.aspx
>>>>>
>>>>>
>>>>> Der aktuellen Verbindung? Hmmm, das weiß ich so auch nicht,
>>>>> sorry. Alle registrierten Anbieter findest Du so heraus:
>>>>>
>>>>>
http://msdn.microsoft.com/de-de/library/system.data.common.dbproviderfactories.getfactoryclasses.aspx
>>>>>
>>>>> --
>>>>> Tschau, Stefan
>>>>> Microsoft MVP - Visual Developer ASP/
ASP.NET
>>>>>
http://www.asp-solutions.de/ - Consulting, Development
>>>>>
http://www.aspnetzone.de/ -
ASP.NET Zone, die
ASP.NET Community
>>>>>> On Tuesday, January 20, 2009 4:19 PM Marc Fischer wrote:
>>>>>> Alle DBConnection haben dasselbe Interface implementiert über welches man
>>>>>> dann auch solche Komponenten an Propertys von Klassen andübeln kann.
>>>>>>> On Wednesday, January 21, 2009 9:05 AM Merwed wrote:
>>>>>>> Meine DbConnection hat jedenfalls keine Eigenschaft die den DataProvider
>>>>>>> angeben würde.
>>>>>>>> On Wednesday, January 21, 2009 9:08 AM Merwed wrote:
>>>>>>>> Das ist ja alles schön und gut aber auch alles andere als allgemein und mit
>>>>>>>> viel Code verbunden. Da bevorzuge ich doch meine eigene Lösung, die immerhin
>>>>>>>> automatisch alle (in der machine.config) hinterlegten Provider erkennt
>>>>>>>> (Aktuelles Beispiel: Installation des SQL Express 2008 erweitert die
>>>>>>>> machine.config um den Provider für SqlCe. Das wird dann automatisch mit
>>>>>>>> berücksichtigt).
>>>>>>>>> On Wednesday, January 21, 2009 9:12 AM Merwed wrote:
>>>>>>>>> Genau. So mach ich das ja jetzt auch (siehe Posting vom 19.01.2009, 19:09
>>>>>>>>> Uhr). Leider muss man dann erstmal für jeden der ermittelten Provider ein
>>>>>>>>> DbConnection-Objekt instanziieren, um dann über einen Vergleich der Typen
>>>>>>>>> herauszufinden, ob der erzeugte Connection-Typ dem Typ der fraglichen
>>>>>>>>> Connection entspricht. Funktionieren tut es aber gut und es ist auch
>>>>>>>>> allgemein.
>>>>>>>>>> On Wednesday, January 21, 2009 11:33 AM Peter Götz wrote:
>>>>>>>>>> Hallo Merwed,
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> "Viel Code" ist doch ein relativer Begriff.
>>>>>>>>>> Mit "allgemein" wirst Du spätestens dann ein Problem
>>>>>>>>>> bekommen, wenn ein providerspezifischer DataAdapter,
>>>>>>>>>> DataReader, Command usw. erstellt werden soll.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Und was hast Du dann davon?
>>>>>>>>>> Wie erstelltst Du dann zum Provider passende Commands,
>>>>>>>>>> DataAdapter, DataReader, usw.?
>>>>>>>>>>
>>>>>>>>>> Gruß aus St.Georgen
>>>>>>>>>> Peter Götz
>>>>>>>>>>
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
>>>>>>>>>>> On Wednesday, January 21, 2009 11:36 AM Peter Götz wrote:
>>>>>>>>>>> Hallo Merwed,
>>>>>>>>>>>
>>>>>>>>>>> ich ja den "InvariantProviderName", also zB
>>>>>>>>>>>
http://msdn.microsoft.com/de-de/library/system.data.common.dbproviderfactories.getfactoryclasses.aspx
>>>>>>>>>>>
>>>>>>>>>>> womit es dann mit der "Allgemeinheit" schon mal vorbei ist.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Und providerspezifisch und eben nicht "allgemein" ist dann
>>>>>>>>>>> auch das Erstellen von Commands, DataAdaptern, DataReadern
>>>>>>>>>>> Parameter-Objekten usw.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Was ist daran "allgemein"?
>>>>>>>>>>>
>>>>>>>>>>> Gruß aus St.Georgen
>>>>>>>>>>> Peter Götz
>>>>>>>>>>>
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
>>>>>>>>>>>> On Thursday, January 22, 2009 5:49 AM Merwed wrote:
>>>>>>>>>>>> Wir reden irgendwie an einander vorbei, oder??
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Das ist doch der Sinn der ganzen Übung: Ich bekomme aus der übergebenen
>>>>>>>>>>>> Connection (deren fomaler Typ DbConnection ist und deren aktueller Typ
>>>>>>>>>>>> irgendeinem spezifischen Provider entspricht) ein Factory-Objekt. Und GENAU
>>>>>>>>>>>> DIESES Factory-Objekt ist fortan in der Lage, alle providerspezifischen
>>>>>>>>>>>> Klassen zu erzeugen. Es ist als allgemeines DbProviderFactory deklariert,
>>>>>>>>>>>> erhält in GetFactory(DbConnection) aber eine providerspezifische
>>>>>>>>>>>> Factory-Instanz zugewiesen (zB SqlClientFactory).
>>>>>>>>>>>>
>>>>>>>>>>>> Wenn die übergebene DbConnection also vom Typ SqlConnection ist, dann
>>>>>>>>>>>> erhalte ich aus GetFactory eine SqlClientFactory. Und diese SqlClientFactory
>>>>>>>>>>>> erzeugt mir dann sehr schön meine SqlCommands (im Gewand eines DbCommands),
>>>>>>>>>>>> meine SqlDataAdapter (im Gewand eines DbDataAdapters), usw. Alles sehr schön
>>>>>>>>>>>> allgemein: Ich kann eine beliebige Connection (die von DbConnection
>>>>>>>>>>>> abstammt) hineingeben und alle Routinen funktionieren - obwohl allgemein
>>>>>>>>>>>> formuliert - providerspezifisch. tadaa
>>>>>>>>>>>>
>>>>>>>>>>>> Viele Grüße
>>>>>>>>>>>>> On Thursday, January 22, 2009 5:50 AM Merwed wrote:
>>>>>>>>>>>>> Peter my friend, you got it all wrong.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Siehe Posting vom 22.01.2009, 11:49 Uhr.
>>>>>>>>>>>>>> On Thursday, January 22, 2009 7:31 AM Volkmar Neubauer wrote:
>>>>>>>>>>>>>> Jede DbConnection ist von einem best. Typ von dem aus man auf dem
>>>>>>>>>>>>>> DataProvider schliessen kann.
>>>>>>>>>>>>>>> On Thursday, January 22, 2009 10:58 AM Merwed wrote:
>>>>>>>>>>>>>>> Das ist ganz toll. Nur muss der Code dann vorher schon wissen, welche
>>>>>>>>>>>>>>> DataProvider es gibt. Da müsste dann in etwa stehen
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> if(conn is SqlConnection)
>>>>>>>>>>>>>>> return new SqlClientFactory();
>>>>>>>>>>>>>>> if(conn is OdbcConnection)
>>>>>>>>>>>>>>> return new OdbcClientFactory();
>>>>>>>>>>>>>>> ...
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Der Nachteil liegt auf der Hand:
>>>>>>>>>>>>>>> Alle unterstützten DataProvider müssen explizit aufgezählt werden; künftige
>>>>>>>>>>>>>>> Erweiterungen können so keine Berücksichtigung finden - dazu wäre eine
>>>>>>>>>>>>>>> Anpassung des Codes nötig!
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> In meinem Code werden alle Dataprovider, die dem System bekannt sind
>>>>>>>>>>>>>>> automatisch unterstützt.
>>>>>>>>>>>>>>>> On Friday, February 06, 2009 1:35 PM Markus Springweiler wrote:
>>>>>>>>>>>>>>>> Merwed,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Den Vorschlag wollte ich dir damals auch machen (aber andere waren
>>>>>>>>>>>>>>>> schneller).
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Heute stehe ich vor demselben Problem: Gegeben ist eine bestehende
>>>>>>>>>>>>>>>> Verbinding (DbConnection) und erzeugt werden soll einer neuer
>>>>>>>>>>>>>>>> EntityConnectionString (via EntityConnectionStringBuilder), und dort gibt
>>>>>>>>>>>>>>>> es eine string-Property "ProviderType".
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Soweit so gut, auf dem Entwicklungsrechner. Dummerweise ist die Anwendung
>>>>>>>>>>>>>>>> ein WCF-Service welcher auf einem IIS(7) läuft; bzw. dann nicht mehr, weil
>>>>>>>>>>>>>>>> die testweise Instanziierung einer SqlCe-Connection eine Exception wirft,
>>>>>>>>>>>>>>>> welche trotz try-catch die ganze Anwendung abschiesst, und der
>>>>>>>>>>>>>>>> anschließende DrWatson den Server für eine halbe Minute lang quasi
>>>>>>>>>>>>>>>> unbenutzbar macht:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> "
>>>>>>>>>>>>>>>> Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exception: System.DllNotFoundException
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Message: Die DLL "sqlceme35.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> StackTrace: bei System.Data.SqlServerCe.NativeMethods.SafeRelease(IntPtr& ppUnknown)
>>>>>>>>>>>>>>>> bei System.Data.SqlServerCe.SqlCeConnection.ReleaseNativeInterfaces()
>>>>>>>>>>>>>>>> bei System.Data.SqlServerCe.SqlCeConnection.Dispose(Boolean disposing)
>>>>>>>>>>>>>>>> bei System.Data.SqlServerCe.SqlCeConnection.Finalize()
>>>>>>>>>>>>>>>> "
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Der Code dafür:
>>>>>>>>>>>>>>>> if ( _providerCache.Count == 0 )
>>>>>>>>>>>>>>>> foreach ( var factoryRow in DbProviderFactories.GetFactoryClasses().AsEnumerable() )
>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>> var providerName = factoryRow.Field<string>("InvariantName");
>>>>>>>>>>>>>>>> try
>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>> using ( var probeConn = DbProviderFactories.GetFactory(factoryRow).CreateConnection() )
>>>>>>>>>>>>>>>> _providerCache.Add(probeConn.GetType(), providerName);
>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>> catch { /* nix (schlechter Stil!) */ }
>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hat jemand eine einleuchtende Erklärung, wieso das gleich den ganzen
>>>>>>>>>>>>>>>> Prozess zerschießt?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Im Moment verwende ich jetzt statt des Providercaches:
>>>>>>>>>>>>>>>> _providerCache[connection.GetType()]
>>>>>>>>>>>>>>>> einfach den Namespace der Connection:
>>>>>>>>>>>>>>>> connection.GetType().Namespace
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Das funktioniert zumindest bei SqlServer, Oracle, MySql, SQLite, etc., nur
>>>>>>>>>>>>>>>> bei SqlCe.3.5 nicht, so es in einer anderen (Nicht-WCF)-Anwendung jemals
>>>>>>>>>>>>>>>> benötigt werden sollte.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> /\/\arkus.
>>>>>>>>>>>>>>>>> On Saturday, February 07, 2009 11:43 AM Elmar Boye wrote:
>>>>>>>>>>>>>>>>> Hallo Markus,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Markus Springweiler schrieb:
>>>>>>>>>>>>>>>>> > (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Das weist zunächst darauf hin, dass der SQL Server Compact Treiber
>>>>>>>>>>>>>>>>> nicht richtig installiert ist. Die Programmdateien sollten sich unter:
>>>>>>>>>>>>>>>>> "%ProgramFiles%\Microsoft SQL Server Compact Edition\v3.5"
>>>>>>>>>>>>>>>>> befinden.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Die aktuelle Version findest Du unter:
>>>>>>>>>>>>>>>>> <URL:
http://www.microsoft.com/Downloads/details.aspx?FamilyID=dc614aee-7e1c-4881-9c32-3a6ce53384d9>
>>>>>>>>>>>>>>>>> "Microsoft SQL Server Compact 3.5 Service Pack 1 and Synchronization Services
>>>>>>>>>>>>>>>>> for
ADO.NET version 1.0 Service Pack 1 for Windows Desktop"
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Einen "Abschuß" des Rechners sollte das natürlich nicht hinlegen.
>>>>>>>>>>>>>>>>> Aber Compact ist auch schon anderweitig mal unangenehm aufgefallen :-(
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Der Compact Treiber ist einer der Problemfälle, denn es gibt viele Varianten:
>>>>>>>>>>>>>>>>> <URL:
http://blogs.msdn.com/sqlservercompact/archive/2007/12/19/connectivity-cross-version-compatibility-sql-server-compact-3-5.aspx>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Und der Namespace ist für die aktuelleren immer gleich und zum Teil
>>>>>>>>>>>>>>>>> werden gleiche DLL Namen verwendet. Beim Instanznamen ist allerdings
>>>>>>>>>>>>>>>>> die Versionnummer angehängt:
>>>>>>>>>>>>>>>>> "System.Data.SqlServerCe.3.5"
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Zwar IMHO ist das nicht zu Ende gedacht worden, da dadurch das Ermitteln
>>>>>>>>>>>>>>>>> eines Providers via Factory Instanzname nicht eindeutig machbar ist.
>>>>>>>>>>>>>>>>> Und umgekehrt die Verbindungen keinen Verweis auf die Factory enthalten.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Der "Erkennungsalgorithmus" ist insofern problematisch.
>>>>>>>>>>>>>>>>> Es es das ein Treiber nicht richtig installiert ist, Reste in
>>>>>>>>>>>>>>>>> der Konfiguration übriggeblieben sind oder andere Voraussetzungen
>>>>>>>>>>>>>>>>> nicht erfüllt sind.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Da es keine wirklich universelle Lösung gibt, würde ich an Deiner
>>>>>>>>>>>>>>>>> Stelle, es für die von Dir genutzten Treiber fest eincodieren.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Gruß Elmar
>>>>>>>>>>>>>>>>>> On Saturday, February 07, 2009 11:59 AM Thorsten Doerfler wrote:
>>>>>>>>>>>>>>>>>> Hallo Elmar,
>>>>>>>>>>>>>>>>>> Elmar Boye schrieb:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Magst Du da vielleicht ins Detail gehen?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thorsten Dörfler
>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>> Microsoft MVP Visual Basic
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> vb-hellfire visual basic faq | vb-hellfire - einfach anders
>>>>>>>>>>>>>>>>>>
http://vb-faq.de/ |
http://www.vb-hellfire.de/
>>>>>>>>>>>>>>>>>>> On Saturday, February 07, 2009 12:48 PM Elmar Boye wrote:
>>>>>>>>>>>>>>>>>>> Thorsten Doerfler schrieb:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Die letzte Woche in mpd.sqlserver:
>>>>>>>>>>>>>>>>>>> <URL:
http://groups.google.com/group/microsoft.public.de.sqlserver/browse_thread/thread/2b7a0e74ea661fa2#>
>>>>>>>>>>>>>>>>>>> dort zwar ein Client Szenario, aber ein eher unbefriedigender Ausgang.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Und bei Recherchen dazu tauchten diverse Ungereimtheiten auf,
>>>>>>>>>>>>>>>>>>> der gepostete Link rührt u. a. daher.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Gruß Elmar
>>>>>>>>>>>>>>>>>>>> On Saturday, February 07, 2009 2:12 PM Thorsten Doerfler wrote:
>>>>>>>>>>>>>>>>>>>> Elmar Boye schrieb:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Danke. Ähnliches habe ich leider auch schon erlebt. Das andere ist die
>>>>>>>>>>>>>>>>>>>> lausige Performance die SQL Compact in Verbindung mit LINQ an den Tag legt.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thorsten Dörfler
>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>> Microsoft MVP Visual Basic
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> vb-hellfire visual basic faq | vb-hellfire - einfach anders
>>>>>>>>>>>>>>>>>>>>
http://vb-faq.de/ |
http://www.vb-hellfire.de/
>>>>>>>>>>>>>>>>>>>>> On Sunday, February 08, 2009 3:50 PM Elmar Boye wrote:
>>>>>>>>>>>>>>>>>>>>> Hallo Thorsten,
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Thorsten Doerfler schrieb:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Wenn Du eine kleine fixe Datenbank willst nimm SQLite für
ADO.NET:
>>>>>>>>>>>>>>>>>>>>> <URL:
http://sqlite.phxsoftware.com/>
>>>>>>>>>>>>>>>>>>>>> läuft fast überall und ist klein und schnell.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Linq2Sql klappt damit naturgemäß nicht, da nur SqlClient und SqlCe.
>>>>>>>>>>>>>>>>>>>>> Aber eine Unterstützung fürs Entity Framework gibt es -
>>>>>>>>>>>>>>>>>>>>> getestet habe ich das allerdings bisher nicht.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Gruß Elmar
>>>>>>>>>>>>>>>>>>>>>> On Sunday, February 08, 2009 5:03 PM Thorsten Doerfler wrote:
>>>>>>>>>>>>>>>>>>>>>> Hallo Elmar,
>>>>>>>>>>>>>>>>>>>>>> Elmar Boye schrieb:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Synchronization Services? ;-)
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Zudem wäre der Umstellungsaufwand im laufenden Projekt nicht ohne. An
>>>>>>>>>>>>>>>>>>>>>> kritischen Stellen sind wir jetzt dazu übergegangen die Daten klassisch
>>>>>>>>>>>>>>>>>>>>>> über DataReader abzugreifen, das ist stellenweise um den Faktor 20
>>>>>>>>>>>>>>>>>>>>>> schneller, wenn in die gleichen Objekte gekapselt wird.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Werd das Entity Framework demnächst generell mal antesten bezüglich der
>>>>>>>>>>>>>>>>>>>>>> Performance, aber mir nicht allzuviel davon versprechen.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thorsten Dörfler
>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>> Microsoft MVP Visual Basic
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> vb-hellfire visual basic faq | vb-hellfire - einfach anders
>>>>>>>>>>>>>>>>>>>>>>
http://vb-faq.de/ |
http://www.vb-hellfire.de/
>>>>>>>>>>>>>>>>>>>>>>> On Sunday, February 08, 2009 5:36 PM Elmar Boye wrote:
>>>>>>>>>>>>>>>>>>>>>>> Hallo Thorsten,
>>>>>>>>>>>>>>>>>>>>>>> Thorsten Doerfler schrieb:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Das sieht es wohl noch etwas mau aus:
>>>>>>>>>>>>>>>>>>>>>>> <URL:
http://sqlite.phxsoftware.com/forums/t/1381.aspx>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Zu den Synchronization Services kann ich derzeit nur wenig besteuern.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> ... auch EF ist im allgemeinen IMHHO leider nicht so ganz das Wahre
>>>>>>>>>>>>>>>>>>>>>>> (und Linq2Sql eine Sackgasse).
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Das vertrackte mit den derzeitigen Microsoft
ADO.NET Erweiterungen:
>>>>>>>>>>>>>>>>>>>>>>> Sie basteln immer auf lange dran herum, aber das Endergebnis
>>>>>>>>>>>>>>>>>>>>>>> ist nicht so das Gelbe vom ...
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Gruß Elmar
>>>>>>>>>>>>>>>>>>>>>>>> On Monday, February 09, 2009 3:57 AM Markus Springweiler wrote:
>>>>>>>>>>>>>>>>>>>>>>>> Elmar ,
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> In normalen Endanwendungen (z.B. LINQPad) geht der schon, auch auf dem
>>>>>>>>>>>>>>>>>>>>>>>> Wcf-Server -- seltsamerweise bekam der Wcf-Client sogar noch eine
>>>>>>>>>>>>>>>>>>>>>>>> FaultException deren Text etwas in der Art sagte, daß SqlCe innerhalb eines
>>>>>>>>>>>>>>>>>>>>>>>> ASP.NET-Kontexts nichts verwendet werden kann (und danach oder
>>>>>>>>>>>>>>>>>>>>>>>> währenddessen wurde dann der Service abgeschossen).
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> "Rechner" wäre dann doch etwas zuviel. Es war "nur" der jeweilige w3p.exe
>>>>>>>>>>>>>>>>>>>>>>>> Prozess.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Das wiederum ist eindeutig (C#-Expression, LINQPad-tauglich):
>>>>>>>>>>>>>>>>>>>>>>>> from row in System.Data.Common.DbProviderFactories.GetFactoryClasses().AsEnumerable()
>>>>>>>>>>>>>>>>>>>>>>>> let factory = System.Data.Common.DbProviderFactories.GetFactory(row)
>>>>>>>>>>>>>>>>>>>>>>>> let connection = factory.CreateConnection()
>>>>>>>>>>>>>>>>>>>>>>>> select new {name = row.Field<string>("InvariantName"), type = connection.GetType().AssemblyQualifiedName}.ToString()
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> ergibt:
>>>>>>>>>>>>>>>>>>>>>>>> { name = System.Data.SqlServerCe, type =
>>>>>>>>>>>>>>>>>>>>>>>> System.Data.SqlServerCe.SqlCeConnection, System.Data.SqlServerCe,
>>>>>>>>>>>>>>>>>>>>>>>> Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 }
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> und
>>>>>>>>>>>>>>>>>>>>>>>> { name = System.Data.SqlServerCe.3.5, type =
>>>>>>>>>>>>>>>>>>>>>>>> System.Data.SqlServerCe.SqlCeConnection, System.Data.SqlServerCe,
>>>>>>>>>>>>>>>>>>>>>>>> Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 }
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Ich sehe da keinen Interpretationsspielraum.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Das stimmt allerdings: Auf meinem Privatrechner ist der alte Ce-Treiber
>>>>>>>>>>>>>>>>>>>>>>>> wohl noch irgendwo in der machine.config gelistet, aber die Assemblies
>>>>>>>>>>>>>>>>>>>>>>>> existieren nicht mehr.
>>>>>>>>>>>>>>>>>>>>>>>> Aber solange Exceptions ordentlich geschluckt werden können, sollte das ja
>>>>>>>>>>>>>>>>>>>>>>>> kein Problem sein (ists aber).
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Es würde schon reichen, wenn die gefangene Exception nicht den ganzen
>>>>>>>>>>>>>>>>>>>>>>>> Prozess eliminieren würde.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>> /\/\arkus.
>>>>>>>>>>>>>>>>>>>>>>>>> On Monday, February 09, 2009 5:04 AM Elmar Boye wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> Hallo Markus,
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Markus Springweiler schrieb:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Das war (bewußt) flapsig geschrieben...
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Was dort hinterlegt schon - nur muß man dazu wissen, welche "Name"
>>>>>>>>>>>>>>>>>>>>>>>>> die Factory bekommen hat, und dafür gibt es keine eindeutige Festlegung.
>>>>>>>>>>>>>>>>>>>>>>>>> (Und was die vielen anderen - nicht von Microsoft stammenden - Provider tun,
>>>>>>>>>>>>>>>>>>>>>>>>> will ich gar nicht so genau wissen).
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Aber lassen wir das theoretisieren an dieser Stelle.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Die spezielle Ausnahme und das Beenden des Prozesses durch den CE Treiber
>>>>>>>>>>>>>>>>>>>>>>>>> ist nicht akzeptabel - und kaum beabsichtigt.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Der offizielle Weg wäre ein Microsoft Support Case
>>>>>>>>>>>>>>>>>>>>>>>>> bzw. ein Connect Feedback.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Auf Connect finden sich einige:
>>>>>>>>>>>>>>>>>>>>>>>>> <URL:
http://www.google.de/search?q=sqlceme35+site%3Aconnect.microsoft.com>
>>>>>>>>>>>>>>>>>>>>>>>>> Die beziehen sich, so weit ich sehen kann, auf den ursprünglich fehlenden
>>>>>>>>>>>>>>>>>>>>>>>>> X64 Support, was mit SQL Server Compact 3.5 SP1 behoben sein sollte,
>>>>>>>>>>>>>>>>>>>>>>>>> da dort nativer 64-Bit Support vorhanden ist:
>>>>>>>>>>>>>>>>>>>>>>>>> <URL:
http://support.microsoft.com/kb/955965>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Zunächst solltest Du also prüfen, ob das Service Pack 1 installiert ist,
>>>>>>>>>>>>>>>>>>>>>>>>> wenn Du es nicht bereits getan hast.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Ändert das nichts, und Du arbeitest unter x64, solltest Du mal,
>>>>>>>>>>>>>>>>>>>>>>>>> wie den Connect Feedbacks zu entnehmen auf x86 wechseln.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Bugs sind nun mal gemein und halten sich nicht an Regeln,
>>>>>>>>>>>>>>>>>>>>>>>>> oder wann sie einen zwicken ;-))
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Gruß Elmar