2010-01-13 11 views
10

Sto sviluppando un'applicazione WinForm in C Sharp sul framework .net. La stringa base di dati che sto usando fin d'ora èUtilizzo di più lettori di dati

<add key="Conn" value="Data Source=MNTCON016; Database=Overtime_Calculator;Trusted_Connection=True;MultipleActiveResultSets=true" /> 

Come sto utilizzando Microsoft SQL Server 2005 per lo sviluppo, posso usare 2 lettori di dati contemporaneamente utilizzando la proprietà MultipleActiveResultSets true come detto sopra.

Il metodo utilizzato per richiamare i lettori di dati 2 è il seguente:

public static void SignUpControllerDay(DateTime Date, System.Windows.Forms.DataGridView PassedGrid) 
    { 
     string sql_SignUp = String.Format(@"SELECT Emp_ID as Emp_ID, Name as Name, Sum(Sum) as Sum FROM 
              (SELECT DISTINCT o.Date, e.Emp_ID as Emp_ID, 
              e.First_Name+ ' ' +e.Last_Name as Name, 
              o.Quantity as Sum 
              FROM Employee e,OT_Hours o,Position p,Signup_Sheet s 
              WHERE e.Emp_ID=o.Emp_ID 
              and e.Emp_ID = s.Employee_ID 
              and s.Day_Shift = 1 
              and e.Position_ID = p.Position_ID 
              and p.Position_Name = 'Controller' 
              and o.Quantity NOT IN(0.3) 
              and s.Date = '{0}' 
              and o.Date <= CONVERT(VARCHAR,'{0}',101) AND o.Date > CONVERT(VARCHAR,DATEADD(YYYY,-1,'{0}'),101)) 
              as OVERTIME 
              GROUP BY Emp_ID,Name 
              ORDER BY Sum", Date); 

     SqlConnection sqlConn = null; 
     SqlCommand cmd_SignUp; 
     SqlDataReader dr_SignUp; 
     try 
     { 
      sqlConn = new SqlConnection(databaseConnectionString); 
      sqlConn.Open(); 
      cmd_SignUp = new SqlCommand(sql_SignUp, sqlConn); 
      dr_SignUp = cmd_SignUp.ExecuteReader(); 

      while (dr_SignUp.Read()) 
      { 
       ArrayList arrPhone = new ArrayList(); 
       string sql_Phone = String.Format("SELECT Phone_Number FROM Contact_Details WHERE Emp_ID = {0}", dr_SignUp["Emp_ID"]); 
       SqlCommand cmd_Phone = new SqlCommand(sql_Phone, sqlConn); 
       SqlDataReader dr_Phone = cmd_Phone.ExecuteReader(); 
       while (dr_Phone.Read()) 
       { 
        arrPhone.Add(dr_Phone["Phone_Number"].ToString()); 
       } 
       //--Retrieving Sectors 
       ArrayList arrSector = new ArrayList(); 
       string sql_Sector = String.Format(@"SELECT e1.EMP_ID, 
               (SELECT cast(Sector_ID as varchar(10)) + ';' 
               FROM Employee_Sector_relationship e2 
               WHERE e2.Emp_ID = e1.Emp_ID 
               ORDER BY Sector_ID 
               FOR XML PATH('')) AS Sectors 
               FROM Employee_Sector_Relationship e1 
               WHERE Emp_ID = {0} 
               GROUP BY Emp_ID ", dr_SignUp["Emp_ID"]); 
       SqlCommand cmd_Sector = new SqlCommand(sql_Sector, sqlConn); 
       SqlDataReader dr_Sector = cmd_Sector.ExecuteReader(); 
       while (dr_Sector.Read()) 
       { 
        arrSector.Add(dr_Sector["Sectors"].ToString()); 
       } 
       if (arrSector.Count == 0) 
       { arrSector.Add(" "); } 
       if (arrPhone.Count == 0) 
       { arrPhone.Add(" "); } 
       //-- 
       if (arrPhone.Count == 2) 
       { 
        PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), arrSector[0], dr_SignUp["Sum"], arrPhone[0], arrPhone[1]); 
       } 

       else 
       { 
        PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), arrSector[0], dr_SignUp["Sum"], arrPhone[0]); 
       } 
      } 

     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error found in SignUpControllerDay..." + Environment.NewLine + e.ToString()); 
     } 
     finally 
     { 
      if (sqlConn != null) 
      { 
       sqlConn.Close(); 
      } 
     } 
    } 

tutto funziona bene. Ora il vero problema. Sono stato informato che il server SQL di produzione per l'applicazione per l'esecuzione è Microsoft SQL Server 2000. Dopo aver fatto un po 'di ricerche, ho scoperto che Microsoft server 2000 non supporta più set di risultati attivi propery. In breve, non mi consente di utilizzare 2 lettori di dati contemporaneamente.

ho bisogno di sapere come leggere i dati da 2 tabelle diverse, allo stesso tempo, per quanto riguarda SQL Server 2000.

Ci sono altri modi in cui posso leggere i dati come ho accennato nel codice ..

Per favore aiuto .. l'applicazione è quasi fatta ed è pronta per andare in produzione. ma MS Server 2000 doesnt consentire al applcaition di lavorare di conseguenza ...

si prega di aiutare

risposta

14

Puoi avere due datareader attivi in ​​Sql Server 2000 semplicemente creando due connessioni.

Per dimostrarlo, devo prima rimproverarvi per l'utilizzo di due pratiche molto scarse: sql dinamico e arraylists. Né c'è posto nel codice. Dovresti anche leggere il costrutto di utilizzo, anche se hai le mie scuse e le condoglianze per "usare" e "arraylists" se stai ancora utilizzando .net 1.1.

Detto questo, ecco come il codice dovrebbe essere:

string sql_Phone = "SELECT Phone_Number FROM Contact_Details WHERE Emp_ID = @EmpID"; 
using (SqlConnection cn2 = new Sqlconnection(databaseConnectionString)) 
using (SqlCommand cmd_Phone = new SqlCommand(sql_Phone, cn2)) 
{ 
    cmd_Phone.Parameters.Add("@EmpID", SqlDbType.Int); 
    cn2.Open(); 

    while (dr_SignUp.Read()) 
    { 
     List<string> arrPhone = new List<string>(); 
     cmd_Phone.Parameters[0].Value = dr_SignUp["Emp_ID"]; 

     using (SqlDataReader dr_Phone = cmd_Phone.ExecuteReader()) 
     { 
      while (dr_Phone.Read()) 
      { 
       arrPhone.Add(dr_Phone["Phone_Number"].ToString()); 
      } 
     } 

Inoltre, guardando il codice ho il sospetto che cosa realmente bisogno di fare è ri-scrivere il vostro SQL. È possibile combinare tutti quelli in una singola query che si collega direttamente alla griglia.

4

Certo:

public void SignUpControllerDay() 
{ 
    using (var conn = new SqlConnection(ConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = "SELECT ..."; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       var phone = reader["Phone_Number"].ToString(); 
       Bar(phone); 
      } 
     } 
    } 
} 

public void Bar(string phone) 
{ 
    using (var conn = new SqlConnection(ConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = "SELECT ..."; // use phone to prepare statement 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // Fill the grid 
      } 
     } 
    } 
} 
1

si potrebbe aprire connessioni multiple di database con 1 lettore per ogni connessione

-5

quindi, non è possibile! Semplice come quella, l'unica risposta!

connessione multipla è un workaroud!

una connessione non può gestire contemporaneamente più recordset

+2

Questa non è una risposta, più adatto come un commento, E anche il richiedente della questione din't cura di connessioni multiple. – whihathac

Problemi correlati