2012-04-20 4 views
7

반환 :이 참조 어떻게이 코드 가지고 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; 
     } 
    } 
} 

를?

시도했지만 작동하지 않습니다.

SqlDataReader reader = GeneralFunctions.GetGeneralInformation(); 

독자로부터 어떻게 읽습니까?

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

편집 :

지금 다음 오류 점점 오전 :

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

다른 SqlDataReader처럼 읽을 수없는 이유는 무엇입니까? 실패합니까? 그렇다면, 그것은'using' 문 때문입니다. 리더를 사용하기 전에 연결을 종료하고 있습니다. –

+0

@ JohnSaunders 독자의 귀환을 시도하고 있습니다. 내가하고 싶은 일을 성취하기위한 최선의 방법이 확실하지 않습니다. 기본적으로 데이터베이스의 데이터로 채워지는 asp.net 양식입니다. 내가 그렇게 생각할 수있는 유일한 방법은 asp.net 텍스트 상자에 정보를 채울 수 있도록 독자를 반환하는 것입니다. –

+1

독자가 채워진 객체를 반환 할 수 있습니다. 그리고 당신은 아직도 작동하지 않는 것을 말하지 않았습니다. –

답변

15

문제는 기능을 떠나는 것입니다 : 여기

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

업데이트 된 코드입니다 (return 문을 통해)에서 나가게됩니다.블록이 있으므로 사용중인 SqlDataReader 및 SqlConnections가 삭제됩니다.

public static IEnumerable<IDataRecord> GetGeneralInformation (int RecID) 

을 다음과 같이 함수의 중간 업데이트 : 문제를 해결하기 위해, 다음과 같이 함수 서명을 변경하려고 마지막에 대한

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

을 "어떻게 그것을 읽을 수 있습니까? " 부분은 다음과 같습니다

정의에
string result = reader.First()["Status"].ToString(); 
+0

IEnumerable 및 수익률을 이해하는 데 도움이 될까요? 내가 그들을 볼 수 없다면, 나는 그 답을 고맙게 생각한다. –

+0

@BrokenGlass - 사용해보기, 훌륭하게 작동합니다. 코드는 장면 뒤에서 별도의 클래스로 "들어 올려지고"열거 후에는 처분되지 않습니다. –

+0

@JamesWilson yield 키워드는 "반복기"를 만듭니다. 그것은 어떤 종류의 컬렉션을 반복하는 법을 알고있는 객체입니다. IEnumerable 은 SqlDataReader의 중요한 부분을 설명하는 또 다른 방법입니다. foreach (;;) 루프에서 사용할 수 있습니다. –

-1

하는 using 문이 호출 된 후 객체를 폐기 할 예정이다.

따라서 데이터 판독기를 반환하면 폐기됩니다.

+1

-1 : '사용 중'블록에서 확실히 복귀 할 수 있습니다! –

+0

무슨 소리하는거야? 수익률이 필요 없습니다. 시도 해봐. 작동하지 않을 수도 있지만 확실히 컴파일됩니다. –

0

내에서 데이터베이스 연결 을 만드는 중입니다.

여러 가지 방법으로 데이터베이스 리소스를 공유하려는 경우 SqlConnection을이 범위 밖으로 이동하십시오.

이렇게하면이 함수에서 Reader를 반환 할 수 있습니다. 그러면이 함수가 유지됩니다.

또한이 함수 내에서 .Read()를 사용하지 말고 객체를 반환하십시오.

6

app.config 또는 web.config의 AppSettings 섹션에 연결 문자열을 추가하십시오.

 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

내가 this StackOverflow answer 언급 할 가치가 생각 : SqlDataReader 개체를 반환하는

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

// 기능이 기능을 사용하려면

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

결과. 매우 간단하고 사용하기 쉬운 솔루션입니다.