DetailPage-MSS-KB

Knowledge Base

Artikel ID: 313510 - Laatste beoordeling: zondag 27 februari 2011 - Wijziging: 2.0

 

Op deze pagina

Symptomen

Wanneer u contact opneemt met eenOleDbDataReaderdat roept deLezenmethode van een thread verschillende single-threaded apartment (STA) dan in het object is gemaakt, verschijnt de volgende uitzondering:
System. InvalidOperationException: de OleDbDataReader. Read moet worden gebruikt in dezelfde thread op die is gemaakt. Als de ApartmentState van deze thread niet ApartmentState

Oorzaak

Dit probleem treedt op omdat de onderdelen die worden geïmplementeerd IRowset samen de free-threaded marshaller niet, hoewel deze gemarkeerd met een threadmodel van beide. Hierdoor OLE32 voor eigen gebruik IMarshal, ofwel een typelib of een proxy en stub vereist worden geregistreerd voor de interface.

Oplossing

Dit probleem wilt omzeilen, moet u controleren of u eenOleDBobject alleen in de STA-thread waarin deze is gemaakt in of uit elk multithreaded apartment (MTA) als het is gemaakt op een MTA.

Status

Microsoft heeft bevestigd dat dit zich kan voordoen in de Microsoft producten die aan het begin van dit artikel worden vermeld.

Meer informatie

Stappen om het probleem te reproduceren

  1. Gebruik Klad blok of een andere teksteditor een c#-bestand maken met de naam STA_bug.cs met de volgende code:
    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Diagnostics;
    using System.Threading;
    
    public class Class1 {
    
        static public ManualResetEvent s_resetevent;
        static public OleDbDataReader s_datareader;
    
        static public void Main(string[] args) {
            Thread.CurrentThread.ApartmentState = ApartmentState.STA; // MTA works
            try {
                BugMultiThread();
            }
            catch(Exception e) {
                Console.WriteLine(e.ToString());
            }
        }
    static public void BugMultiThread() {
            // We use NT authentication here.
            OleDbConnection connection = new OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=(local)");
    
            // If you want to use SQL Mode authentication, 
            // make necessary changes to point to your SQL Server.
            // OleDbConnection connection = new OleDbConnection("Provider=SQLOLEDB;Data Source=myserver;Initial Catalog=pubs;User ID=username;Password=password;");
    
            connection.Open();
            try {
                OleDbCommand command = new OleDbCommand("select top 2 * from authors; select top 2 * from publishers;", connection);
                s_datareader = command.ExecuteReader();
    
                s_resetevent = new ManualResetEvent(false);
                (new Thread(new ThreadStart(BugMultiThreadRead))).Start();
                s_resetevent.WaitOne();
            }
            finally {
                if ((null != s_datareader) && !s_datareader.IsClosed) {
                    s_datareader.Close();
                }
                connection.Close();
            }
        }
    
        static public void BugMultiThreadRead() {
            try {
                Console.WriteLine("BugMultiThreadRead: start");
                if (null != s_datareader) {
                    try {
                        do {
                            while (s_datareader.Read()) {
                                Console.Write(".");
                            }
                            Console.Write("*");
                        } while (s_datareader.NextResult());
                    }
                    catch(Exception e) {
                        Console.WriteLine();
                        Console.WriteLine(e.ToString());
                    }
                    Console.WriteLine();
                }
            }
            finally {
                Console.WriteLine("BugMultiThreadRead: signal finish");
                s_resetevent.Set();
            }
        }
    }
    					
  2. Gebruik de Visual Studio.NETTO opdrachtprompt uit te voeren de de volgende opdracht:
    csc.exe /r:system.dll /r:system.data.dll STA_bug.cs & STA_bug.exe
    						
    Houd er rekening mee dat u de volgende uitzonderingen ontvangt:
    BugMultiThreadRead: start
    
    System.InvalidOperationException: The OleDbDataReader.Read must be used from the same thread on which is was created if that thread's
    ApartmentState was not ApartmentState.MTA ---> System.InvalidCastException:
    QueryInterface for interface IRowset failed.
       at System.Data.Common.IRowset.GetNextRows(IntPtr hChapter, Int32 lRowsOffset, Int32 cRows, Int32& pcRowsObtained, IntPtr& pprghRows)
       at System.Data.OleDb.OleDbDataReader.GetRowHandles()
       --- End of inner exception stack trace ---
       at System.Data.OleDb.OleDbDataReader.GetRowHandles()
       at System.Data.OleDb.OleDbDataReader.ReadRowset()
       at System.Data.OleDb.OleDbDataReader.Read()
       at Class1.BugMultiThreadRead()
    
    BugMultiThreadRead: signal finish
    					
  3. Als u een revisie MTA, als volgt gebruiken
    Thread.CurrentThread.ApartmentState = ApartmentState.MTA;
    						
    het juiste resultaat wordt weer gegeven:
    BugMultiThreadRead: start
    ..*..*
    BugMultiThreadRead: signal finish
    					

De informatie in dit artikel is van toepassing op:
  • Microsoft Visual Studio .NET 2002 Professional Edition op de volgende platformen
    • Microsoft Visual C# .NET 2002 Standard Edition
Trefwoorden: 
kbvs2002sp1sweep kbbug kberrmsg kbmt KB313510 KbMtnl
Machine-translated ArticleMachine-translated Article
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:313510  (http://support.microsoft.com/kb/313510/en-us/ )
Delen
Extra ondersteuningsopties
Microsoft Community Support-forums
Neem rechtstreeks contact met ons op
Een door Microsoft gecertificeerde partner zoeken
Microsoft Store