2013-04-25 78 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; 
} 

我敢肯定,這種方法是遠遠不夠完善和PPL會很快指出這一點(我是基本上是由我的主管給出的,因爲我之前沒有任何ASP.NET的經驗),但我真正關心的是它的工作原理。我的問題是:如何修改以返回全部給定記錄的字段?

這些字段將是VARCHAR2,CHAR或DATE數據類型(如果這有所不同),並且其中某些值可能爲空。我在想我可以將它們轉換爲字符串並將它們作爲列表返回?

+0

注意:'cmd.CommandText'容易受到注入攻擊 – rdev5 2016-06-16 23:58:53

回答

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 2013-04-25 19:15:54

+0

是的。它填充傳入的對象數組,同時返回列數作爲返回值。這裏有一個指向它的文檔的鏈接:http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracledatareader.getvalues.aspx – Jasmine 2013-04-25 19:17:52

+0

好的謝謝然後在'//讀取值[我]'部分? – user1985189 2013-04-25 19:21:27

6

如果u想是這樣的:

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

嗯,也許!我將不得不考慮它tmw,但感謝您的回答 – user1985189 2013-04-25 20:29:58

+1

這是閱讀每列*的名稱*這是不完全相同的事情閱讀所有的列,不管他們的名字是什麼。 – Jasmine 2013-04-25 22:03:01

+1

注意:'sqlQuery'容易受到注入攻擊 – rdev5 2016-06-16 23:58:23

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; 
    } 
相關問題