【问题标题】:Parsing tnsnames.ora in Visual C# 2008在 Visual C# 2008 中解析 tnsnames.ora
【发布时间】:2010-11-17 14:23:40
【问题描述】:

如何使用 Visual C#(Visual Studio 2008 Express 版)解析 tnsnames.ora 文件以获取 tnsnames ? 例如,我的 tnsnames.ora 文件包含

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = shaman)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
BILL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.58)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

如何解析该文件以获取 TNSNAMES(即 ORCL、BILL 等)。如果这个问题听起来太明显,请原谅我,我正在学习并尝试使用 C#

【问题讨论】:

    标签: c# visual-studio-2008 oracle tnsnames


    【解决方案1】:

    首先,您需要the syntax rules for this file

    这可能有一个 hack,但我个人会使用完整的解析器,例如 ANTLR 结合 the proper grammar(ANTLR 语法的完整列表 can be found here)。

    【讨论】:

    • 谢谢!这应该很有帮助。
    【解决方案2】:

    与 Sathya 提供的方法一起,创建一个方法:

    StringBuilder strTns = new StringBuilder ();
    
    foreach ( var fileLine in System.IO.File.ReadAllLines(fiTNS.FullName ) )
    {
        if ( (fileLine.Length > 0 
               && fileLine.Trim().Substring(0,1) != "#" 
              )
              && ( fileLine.Length > 0 
                    && fileLine.Trim ().Substring (0,1) != "/" 
                  )
            )
    
            {
               strTns.AppendFormat("{0}{1}", fileLine, Environment.NewLine);
            }
    }
    
    //TNSNamesValues = System.IO.File.ReadAllText (fiTNS.FullName).ToString ().Replace ("\n", "" ).Replace ("\r", "");
    String[] splitSeparator = LoadTNSNames (OracleHomeRegistryKey).ToArray ();
    String[] TNS = strTns.ToString().Split (splitSeparator, StringSplitOptions.None);
    

    【讨论】:

      【解决方案3】:
      public List<string> ReadTextFile(string FP)
      {
      
          string inputString;
          List<string> List = new List<string>();
      
          try
          {
              StreamReader streamReader = File.OpenText(FP.Trim()); // FP is the filepath of TNS file
      
              inputString = streamReader.ReadToEnd();
              string[] temp = inputString.Split(new string[] {Environment.NewLine},StringSplitOptions.None);
      
              for (int i = 0; i < temp.Length ;i++ )
              {
                  if (temp[i].Trim(' ', '(').Contains("DESCRIPTION"))
                  {                   
                      string DS = temp[i-1].Trim('=', ' ');
                      List.Add(DS);
                  }             
      
              }
              streamReader.Close();
          }
          catch (Exception EX)
          {
          }
      
      
          return List;
      
      }
      

      【讨论】:

      • OP 提到他对 C# 还很陌生。也许添加一些解释和理由可能有助于避免复制/粘贴未完全理解的代码。
      【解决方案4】:

      这段代码对我有用,也许我们可以重构它以处理多个条目或创建可重用函数。

          //Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=49161))(CONNECT_DATA=(SERVICE_NAME=xe)));User Id=myuser;Password=mypassword;
          var stringParts = _connectionString.Split('(');
      
          //HOST=localhost)
          var hostPair = stringParts.First(s => s.Contains("HOST")).Split("=");
          var host = hostPair[1].Substring(0, hostPair[1].IndexOf(")"));
      
          //PORT=49161)
          var portPair = stringParts.First(s => s.Contains("PORT")).Split("=");
          var port = portPair[1].Substring(0, portPair[1].IndexOf(")"));
      
          //SERVICE_NAME=xe)
          var serviceNamePair = stringParts.First(s => s.Contains("SERVICE_NAME")).Split("=");
          var serviceName = serviceNamePair[1].Substring(0, serviceNamePair[1].IndexOf(")"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多