2010-01-13 15 views
10

Estoy desarrollando una aplicación WinForm en C Sharp en .NET Framework. La cadena de base de datos que estoy usando a partir de ahora esUso de varios lectores de datos

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

Como estoy usando Microsoft SQL Server 2005 para el desarrollo, puedo usar 2 lectores de datos de forma simultánea utilizando la propiedad MultipleActiveResultSets true como se mencionó anteriormente.

El método empleado para llamar a los 2 lectores de datos es el siguiente:

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(); 
      } 
     } 
    } 

Todo funciona bien. Ahora el problema real. Me han informado que el servidor SQL de producción para la aplicación en funcionamiento es Microsoft SQL Server 2000. Después de investigar un poco, llegué a saber que el servidor 2000 de Microsoft no es compatible con múltiples conjuntos de resultados activos. En resumen, no me permite usar 2 lectores de datos simultáneamente.

Necesito saber cómo leer los datos de 2 tablas diferentes, al mismo tiempo, en lo que respecta a SQL Server 2000.

¿Hay otras maneras que puedo leer los datos como he mencionado en el código ..

Por favor, ayuda .. la aplicación está casi lista y está lista para entrar en producción. pero MS Server 2000 No permite la applcaition para trabajar en consecuencia ...

favor ayuda

Respuesta

14

Puede tener dos lectores de datos activos en Sql Server 2000 simplemente creando dos conexiones.

Para demostrar esto, primero debo criticarte por utilizar dos prácticas muy deficientes: sql dinámico y listas de arreglos. Ni tiene ningún lugar en tu código. También deberías leer sobre el uso de construcción, aunque tienes mis disculpas y mis condolencias en "usar" y "listas de arreglos" si todavía estás usando .net 1.1.

Dicho esto, aquí es como el código debería ser:

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()); 
      } 
     } 

también, mirando a su código sospecho que lo que realmente tiene que hacer es volver a escribir su SQL. Puede combinar todos esos en una sola consulta que acaba de vincular directamente a la cuadrícula.

4

Claro:

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

se podían abrir múltiples conexiones de base con 1 lector por conexión

-5

¡así que no es posible! tan simple como esa la única respuesta!

¡la conexión múltiple es una workaroud!

una conexión no puede manejar simultáneamente varios conjuntos de registros

+2

Esta no es una respuesta, más se adapte como un comentario, Y también el autor de la pregunta de la cuestión di no se preocupan por múltiples conexiones. – whihathac

Cuestiones relacionadas