2012-04-20 69 views
7

dönersek: Bunu başvuru nasılBu kodu vardır bir SqlDataReader

public static SqlDataReader GetGeneralInformation (int RecID) 
{ 
    using (var conn = new SqlConnection(GetConnectionString())) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = 
     @"SELECT cs.Status, cs.Completed 
      FROM NC_Steps s 
      INNER JOIN NC_ClientSteps cs 
       ON cs.RecID = s.RecID 
      WHERE cs.ClientID = 162 
      AND s.RecID = @value"; 
     cmd.Parameters.AddWithValue("@value", RecID); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      if (reader.Read()) 
      { 
       return reader; 
      } 
      return null; 
     } 
    } 
} 

?

Denedim ama işe yaramıyor.

SqlDataReader reader = GeneralFunctions.GetGeneralInformation(); 

Okuyucudan nasıl okurum?

Reader.GetString(reader.GetOrdinal("Status")) 

Düzenleme:

Şimdi aşağıdaki hatayı alıyorum:

public static IEnumerable<IDataRecord> GetGeneralInformation (int ClientID) 
{ 
    using (var conn = new SqlConnection(GetConnectionString())) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = 
     @"SELECT i.GoLiveDate, i.FirstBonusRun, i.TechFName, i.TechLName, i.TechEmail, i.TechPhone, i.WebISPFName, i.WebISPLName, 
      i.WebISPEmail, i.WebISPPhone, i.FullFillFName, i.FullFillLName, i.FullFillEmail, i.FullFillPhone, d.FName, 
      d.LName, d.HomePhone, d.Email 
      FROM NC_Information i 
      INNER JOIN Distributor d 
      ON d.DistID = i.ClientID 
      WHERE clientID = @value"; 
     cmd.Parameters.AddWithValue("@value", ClientID); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return reader; 
      } 
      yield return null; 
     } 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation((int)Session[ "DistID" ]); 

    //string result = GeneralFunctions.GetGeneralInformation(Globals.GeneralInformation).First()[ "Status" ].ToString(); 
} 
+1

Niçin diğer SqlDataReader gibi okuyorsunuz? Bu başarısız mı? Eğer öyleyse, 'using' ifadeleri yüzünden. Okuyucuyu kullanmadan önce bağlantıyı kapatıyorsunuz. –

+0

@JohnSaunders Okuyucunun kendisini iade etmeye çalışıyorum. Ne yapmak istediğimi gerçekleştirmenin en iyi yolundan emin değilim. Temel olarak bir veritabanından veri ile doldurulmuş bir asp.net formu. Bunu yapmayı düşünebilmemin tek yolu, bilgiyi asp.net metin kutularına doldurabilmek için okuyucuya geri dönmektir. –

+1

Okuyucudan gelen bir nesneyi döndürebilirsiniz. Ve hala neyin işe yaramadığını söylemedin. –

cevap

15

sorun fonksiyonunu bırakarak olmasıdır: Burada

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

güncellenmiş koddur (dönüş ifadesiyle) sizi'den çıkarırblokları, ve kullanmakta olduğunuz SqlDataReader ve SqlConnections atılmıştır.

public static IEnumerable<IDataRecord> GetGeneralInformation (int RecID) 

ve sonra böyle fonksiyonun ortasını güncellemek: soruna çözüm olarak, böyle fonksiyon imza değiştirmeyi deneyin final

using (var reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     yield return reader; 
    } 
} 

"Nasıl ondan okunur? " bölüm, bu gibi görünebilir:

Tanım olarak
string result = reader.First()["Status"].ToString(); 
+0

IEnumerable ve verimin ne yaptığını anlamama yardımcı olabilir misiniz? Eğer onlara bakamıyorsam, cevabı her iki şekilde de takdir ediyorum. –

+0

@BrokenGlass - dene, harika çalışıyor. Kod, sahnelerin ardında ayrı bir sınıfa “kaldırılır” ve sayım işleminden sonraya kadar ulaşılamaz. –

+0

@JamesWilson Verim anahtar kelimesi, "Yineleyici" olarak adlandırılan şeyi oluşturur. Bir türden bir koleksiyonun üstesinden gelmeyi bilen bir nesne. IEnumerable , bir SqlDataReader'ın önemli bölümlerini açıklamanın başka bir yoludur. Bunu bir foreach (;;) döngüsünde kullanabilirsiniz. –

-1

, bir using açıklamada denir sonra bir nesnenin imha gerekiyordu.

Bu nedenle, veri okuyucunuzu geri verdikten sonra atılır.

+1

-1: kesinlikle bir "using" bloğundan geri dönebilirsiniz _can_! –

+0

Sen neden bahsediyorsun? Verim almanıza gerek yok. Git dene. Çalışmayabilir, ama kesinlikle derler. –

0

Sorun, yönteminiz içinde veritabanı bağlantısı oluşturuyorsunuz.

veritabanı kaynaklarını birçok yöntem arasında paylaşacaksanız, bu kapsamın dışında SqlConnection öğesini taşıyın.

Bu sayede Reader'ı bu işlevden döndürebilirsiniz ve kalıcı olacaktır.

Ayrıca, bu işlevin içinde .Read() işlevini kullanmayın, yalnızca nesneyi döndürün.

6

Bağlantı dizenizi app.config veya web.config dosyasındaki AppSettings bölümüne ekleyin.

 string query = @"SELECT cs.Status, cs.Completed 
     FROM NC_Steps s 
     INNER JOIN NC_ClientSteps cs 
      ON cs.RecID = s.RecID 
     WHERE cs.ClientID = 162 
     AND s.RecID = @value"; 
     //you can add more parameters by adding commas 
     var parameters = new SqlParameter[] { 
      new SqlParameter("@value", RecID) 
      }; 

     SqlDataReader dr = executeReader(query, parameters); 
     while (dr.Read()) 
     { 
      //fill your controls with data 
     } 
     dr.Close(); 
1

Ben this StackOverflow answer söz hak inanıyoruz: SqlDataReader dönmek için

public string GetSqlConnection() 
    { 
     return System.Configuration.ConfigurationManager.AppSettings["SqlConnectionString"]; 
    } 

// Fonksiyon işlevini kullanmak için

public SqlDataReader executeReader(string sql, SqlParameter[] parameters=null) 
    { 
     SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = GetSqlConnection(); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = sql; 
     if (parameters != null) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      foreach (SqlParameter p in parameters) 
      { 
       cmd.Parameters.Add(p); 
      } 
     } 
     else 
     { 
      cmd.CommandType = CommandType.Text; 
     } 
     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
     return reader; 
    } 

sonuçlanır. Çok basit ve hoş kullanımlı bir çözüm.