2016-11-22 2 views
0

Ich arbeite an etwas Code, der MDX-Abfragen gegen SQL Server-Analysedienst ausführt. Die MDX-Abfrage wird zweimal im selben Thread ausgeführt und ich habe keine Ahnung warum. Die Abfrage sollte nur einmal ausgeführt werdenC# thread/Abfrage zweimal ausgeführt

Unten ist ein Teil des Codes. Kann mir bitte jemand helfen.

 private void Start_QueryWorkers() 
    {    
      foreach (QueryThread th in _QueryWorkers) 
      { 
      SSASQuery q = new SSASQuery();      
      q.QueryText = "SELECT NON EMPTY { [Measures].[count] } ON COLUMNS FROM [cube]";         
      q.queryThread = th;    
      th.WorkerThread.RunWorkerAsync(q); 
     }   
    } 

    private void QueryWorkerThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     SSASQuery q = e.Argument as SSASQuery;  
     OleDbCommand cmd = new OleDbCommand(q.QueryText, q.queryThread.conn); 
     OleDbDataReader rdr = cmd.ExecuteReader();    
      rdr.Close();   
    } 

     private void btnStartTest_Click(object sender, EventArgs e) 
    {  
      string strConnString = "Provider=MSOLAP;Data Source=SRV001" + ";Initial Catalog=Cube_2015" + ";"; 
     _QueryWorkers.Clear(); 
     {     
      QueryThread thread = new QueryThread(strConnString);   
      thread.WorkerThread = new BackgroundWorker(); 
       thread.WorkerThread.DoWork += new DoWorkEventHandler(this.QueryWorkerThread_DoWork);         
       _QueryWorkers.Add(thread);  
     }        
      Start_QueryWorkers();    
    }    
} 

class SSASQuery 
{ 
    public string QueryText { get; set; }  
    public QueryThread queryThread { get; set; }   
} 

class QueryThread 
{ 
    public QueryThread(string connString) 
    { 
     this.connString = connString; 
     conn = new OleDbConnection(connString); 
     conn.Open();   
     queryList = new SortedList(); 
    } 
    public SortedList queryList { get; set; } 
    public string threadName { get; set; } 
    public string connString { get; set; } 
    public OleDbConnection conn;  
    public BackgroundWorker WorkerThread { get; set; }  
    } 

}

+0

BackgroundWorker ist kein Thread, es ist eine veraltete Abstraktion über einen Thread. Sie gewinnen nichts, wenn Sie versuchen, es zu benutzen, als ob es ein Thread wäre. Es wäre viel einfacher, PLINQ, Parallel.ForEach oder ActionBlock zu verwenden, um jede Abfrage parallel auszuführen und die Ergebnisse dort zu speichern, wo Sie sie speichern möchten. –

+0

hi, ok danke für den Vorschlag. Wie auch immer können Sie helfen, warum der DoWork/BackgroundWorker zweimal im obigen Code ausgeführt wird – DC07

+0

Warum verwenden Sie 'for (int i = 0; i McNets

Antwort

0

gelöst. Code war in Ordnung, es war ein Problem in der Verbindungszeichenfolge, die die Abfrage zweimal erfüllt

Verwandte Themen