2013-04-25 2 views
2

this one과 비슷한 나의 질문은 OracleDataReader를 사용하여 주어진 레코드의 모든 필드를 검색하는 방법입니까? 현재, 나는 한 번에 하나 개의 열 값을 반환이 방법을 사용하고있다 :OracleDataReader를 사용하여 주어진 레코드의 모든 필드를 검색하는 방법은 무엇입니까?

public string Select_File(string filename, string subdirectory, string envID) 
{ 
    Data_Access da = new Data_Access(); 
    OracleConnection conn = da.openDB(); 

    OracleCommand cmd = new OracleCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "SELECT * FROM EIP_Deployment_Files" 
     + " WHERE Filename ='" + filename + "'" 
     + " AND Subdirectory = '" + subdirectory + "'" 
     + " AND Environment_ID = '" + envID + "'"; 
    cmd.CommandType = CommandType.Text; 

    string x; 
    OracleDataReader dr = cmd.ExecuteReader(); 
    if (dr.HasRows) // file exists in DB 
    { 
     dr.Read(); 
     x = dr.GetString(2).ToString(); // return baseline filename (index 2) 
    } 
    else 
    { 
     x = "New File"; 
    } 

    cmd.Dispose(); 
    da.CloseDB(conn); 
    return x; 
} 

나는 (I이었다이 방법은 완벽과는 거리가 멀다하고 PPL이 그것을 지적하는 빠른 될 것이라고 확신 기본적으로 ASP.NET의 사전 경험이 없기 때문에 상사가 부여했습니다.) 그러나 실제로 관심이있는 것은 그것이 작동한다는 것입니다. 내 질문은 : 모두 주어진 레코드에 대한 필드를 반환 할 수 수정 할 수 있습니까?

필드는 VARCHAR2, CHAR 또는 DATE 데이터 유형 중 하나이며 (차이가 나는 경우) 이러한 값 중 일부는 null 일 수 있습니다. 문자열로 변환하여 목록으로 반환 할 수 있다고 생각하고 있습니까?

+0

주 :'cmd.CommandText'는 주입 공격에 취약합니다 – rdev5

답변

6

DataReader에서 현재 행의 열에서 모든 데이터를 읽으려면 GetValues ​​()를 사용하고 데이터베이스 형식의 개체 인 배열에서 값을 추출하면됩니다.

Object[] values; 
int numColumns = dr.GetValues(values); //after "reading" a row 
for (int i = 0; i < numColumns; i++) { 
    //read values[i] 
} 

MSDN은 - "대부분의 응용 프로그램의 경우는 GetValues ​​방법은 모든 열을 검색하는 것이 아니라 개별적으로 각 열을 검색하기위한 효율적인 방법을 제공합니다."

+0

죄송합니다. GetValues ​​()는 레코드의 각 필드에 대한 실제 값을 검색합니까? – user1985189

+0

예. 전달한 객체 배열을 채우고 반환 값으로 열 수를 반환합니다. 다음은 문서에 대한 링크입니다 : http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracledatareader.getvalues.aspx – Jasmine

+0

감사합니다. 그러면 '// 값 [ 내가]'부분? – user1985189

6

유는 다음과 같이 원하는 경우 : 아주 오래된 질문에 대한 답변을 게시

List<User> lstUser = new List<User>(); 
      string sqlQuery = "Select * from User_T where User_Name='" + oUser.UserName + "' And Password='" +oUser.Password + "' AND IsActive='"+1+"' AND IsDelete='"+0+"'"; 
      string connectionString = "Data Source=ORCL;User Id=ACCOUNTS;Password=ACCOUNTS"; 
      using (DBManager dbManager = new DBManager(connectionString)) 
      { 
       try 
       { 

        dbManager.Open(); 
        OracleDataReader dataReader = dbManager.ExecuteDataReader(sqlQuery); 
        while (dataReader.Read()) 
        { 
         oUser = new User(); 
         oUser.Id = Convert.ToInt32(dataReader["ID"]); 
         oUser.CompanyId = Convert.ToInt32(dataReader["Company_ID"]); 
         oUser.BranchId = Convert.ToInt32(dataReader["Branch_ID"]); 
         oUser.UserName = Convert.ToString(dataReader["User_Name"]); 
         lstUser.Add(oUser); 
        } 
        dataReader.Close(); 
        dataReader.Dispose(); 

       } 
       catch 
       (Exception) 
       { 


       } 
       finally 
       { 
        dbManager.Close(); 
        dbManager.Dispose(); 
       } 
+0

아마도 어쩌면! 나는 그것을 들여다 봐야 할 것이다. 그러나 당신의 대답에 대해 감사해야한다. – user1985189

+1

이것은 각 컬럼을 이름 *으로 읽는다. 이름이 무엇이든 상관없이 모든 컬럼을 읽는 것과 똑같은 것은 아니다. – Jasmine

+1

참고 :'sqlQuery'는 주입 공격에 취약합니다 – rdev5

0

죄송합니다. 답변이 정확하지 않으므로 (보안 문제가 있거나 DBNull을 확인하지 않음), 내 자신을 게시하기로 결정했습니다.

public async Task<StringBuilder> FetchFileDetailsAsync(string filename, string subdirectory, string envId) 
    { 
     var sb = new StringBuilder(); 
     //TODO: Check the parameters 

     const string connectionString = "user id=userid;password=secret;data source=" + 
             "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.0.8)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xe)))"; 

     const string selectQuery = "SELECT * FROM EIP_Deployment_Files" 
           + " WHERE Filename = :filename" 
           + " AND Subdirectory = :subdirectory" 
           + " AND Environment_ID = :envID" 
           + " AND rownum<=1"; 

     using (var connection = new OracleConnection(connectionString)) 
     using (var cmd = new OracleCommand(selectQuery, connection) {BindByName = true, FetchSize = 1 /*As we are expecting only one record*/}) 
     { 

      cmd.Parameters.Add(":filename", OracleDbType.Varchar2).Value = filename; 
      cmd.Parameters.Add(":subdirectory", OracleDbType.Varchar2).Value = subdirectory; 
      cmd.Parameters.Add(":envID", OracleDbType.Varchar2).Value = envId; 

      //TODO: Add Exception Handling 
      await connection.OpenAsync(); 
      var dataReader = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection); 

      var rowValues = new object[dataReader.FieldCount]; 
      if (dataReader.Read()) 
      { 
       dataReader.GetValues(rowValues); 
       for (var keyValueCounter = 0; keyValueCounter < rowValues.Length; keyValueCounter++) 
       { 
        sb.AppendFormat("{0}:{1}", dataReader.GetName(keyValueCounter), 
         rowValues[keyValueCounter] is DBNull ? string.Empty : rowValues[keyValueCounter]) 
         .AppendLine(); 
       } 

      } 
      else 
      { 
       //No records found, do something here 
      } 
      dataReader.Close(); 
      dataReader.Dispose(); 
     } 
     return sb; 
    }