2010-01-13 13 views
10

. Net çerçevesinde C Sharp'ta bir WinForm Uygulaması geliştiriyorum. Ben gelişimi için Microsoft SQL Server 2005 kullanıyorum olarak ben bugün itibariyle kullanıyorum veritabanı dizeÇoklu Veri Okuyucular Kullanılıyor

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

, ben yukarıda da belirtildiği gibi true MultipleActiveResultSets özelliğini kullanarak aynı anda 2 veri okuyucuları kullanabilirsiniz.

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

Her şey iyi çalışır: aşağıdaki gibi

2 veri okuyucuları çağırmak için kullanılan yöntem olduğunu. Şimdi asıl sorun. Uygulamaya yönelik SQL Server üretiminin Microsoft SQL Server 2000 olduğunu öğrendim. Biraz araştırma yaptıktan sonra Microsoft sunucu 2000'in birden fazla etkin sonuç kümesini desteklemediğini öğrendim. Kısaca, 2 veri okuyucuyu aynı anda kullanmama izin vermiyor.

ben kodda belirttiğim gibi ben verilerini okuyabilir başka yolları var mı SQL Server 2000

açısından, aynı anda 2 farklı tablolardan veri okumayı bilmek gerekir ..

Lütfen yardım edin .. uygulama neredeyse bitmiştir ve üretime hazırdır. ancak MS sunucusu 2000 doesnt

cevap

14

yapabilirsiniz Sadece iki bağlantı oluşturarak Sql Server 2000'de iki aktif datareader var. Bunu göstermek için önce iki çok zayıf uygulamayı kullandığınız için size yalvarıyorum: dinamik sql ve arraylists. Kodunuzda hiç bir yer yok. Yine de, eğer kullanmıyorsanız, "build" ve "arraylists" hakkında özürlerimi ve başsağlığı dileklerimi kullanmış olsanız da, kullanım düzenini de okumalısınız. sözü

, burada kodunuz var:

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

Ayrıca kodu baktığımızda Sana gerçekten sizin sql yeniden yazma yapmanız gerekenler şüpheli. Tüm bunları, doğrudan ağa bağladığınız tek bir sorguda birleştirebilirsiniz.

4

Emin yardım lütfen ... applcaition buna göre çalışmasını sağlamak:

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

Sen bağlantı başına 1 okuyucu ile birden veritabanı bağlantıları açabilir

-5

, bu mümkün değil! tek cevap bu kadar basit!

Birden çok bağlantı bir workaroud!

bir bağlantı aynı anda

+2

Bu daha bir açıklama gibi uygun bir cevap, değil, Ve ayrıca sorunun asker birden bağlantıları hakkında dikkat din't birden çok kayıt işleyemez. – whihathac