【问题标题】:using variable with oracle database connection string使用带有 oracle 数据库连接字符串的变量
【发布时间】:2016-03-03 08:30:59
【问题描述】:

我有一个小型 c# 软件,可以在多个服务器上的多个数据库上运行,我需要在不同的架构之间切换,所以..
根据当前服务器 ip 我连接到指定服务器上的主表 并获取架构名称,然后通过这种方式在连接字符串中添加为变量.. 使用这种方式使连接字符串变得灵活是否安全? 如果没有,那你有什么建议

string oradb = "Data Source=source;User Id=" + DBSchema + ";Password=pwd;";

【问题讨论】:

  • 这是完全可行的,我目前在 2 个不同的 Oracle 数据库之间切换时会这样做。您的 .Config 文件中需要 2 个连接字符串,而在连接字符串中,您需要执行类似这样的操作 @ 987654322@等...
  • 我已经逐步说明了如何做到这一点,这就像一个魅力,如果你理解我在代码的public string UserConnName { 部分中所做的事情,你可以看到它是如何实现的可以动态调用存储过程,这是帮助您入门的一个示例..

标签: c# oracle oracle11g


【解决方案1】:

通常,运行时参数将存储在您的代码之外,并且在许多情况下,配置文件是最好的地方之一。您可以使用工厂方法来构建连接字符串,如 CodeProject-Don't Hard Code Your Data Providers 中那样,或者您可以编写几行代码来使用 .NET 连接字符串构建器来设置值,如 ConnectionStringBuilder Class 中那样。

【讨论】:

    【解决方案2】:

    例如,目前我有一个 Web 应用程序,它需要 2 个不同的连接的 2 个 Web 表单

    public static string storedProcName = "NameOfSomeStoredProc";
    public string ConnString
    {
        get { return ConfigurationManager.ConnectionStrings["DbConn2"].ConnectionString; }
    }
    
    public string UserConnName
    {
        get { return string.Concat(ConfigurationManager.AppSettings["userConnName"], storedProcName); }
    
    }
    

    方法中的实际存储过程调用将如下所示我根据上面声明的静态存储过程名称传入存储过程名称..

    为自己创建一个 Helper 类,您可以在要执行代码的类中调用类似以下内容

    HelperClass.cs

    public static DataSet ExecuteDataSet2(string sql, CommandType cmdType, params OracleParameter[] parameters)
    {
        using (DataSet ds = new DataSet())
        using (OracleConnection connStr = new OracleConnection(ConfigurationManager.ConnectionStrings["DbConn2"].ConnectionString))
        using (OracleCommand cmd = new OracleCommand(sql, connStr))
        {
            cmd.CommandType = cmdType;
            cmd.CommandTimeout = 60 * 22;
            foreach (var item in parameters)
            {
                cmd.Parameters.Add(item);
            }
    
            try
            {
                cmd.Connection.Open();
                new OracleDataAdapter(cmd).Fill(ds);
            }
            catch (Exception ex)
            {
                utilities.SendErrorEmails(ex);
                throw ex;
            }
            return ds;
        }
    }
    

    例如,如果您有 2 个不同的数据库连接字符串,您的 Web.Config 将如下所示。您将创建与上述相同的方法,将其称为 ExecuteDataSet1.... 并将 DbConn2 更改为 DbConn 并在 Public string ConnString 在你的其他类中将 DbConn2 更改为 DbConn,或者有一个复选框,根据选择,你可以存储 botn ConnString get retrun .. 非常直接地调用你的另一个 ConnString2

     <connectionStrings>
        <add name="DbConn" connectionString="Data Source={0};User Id={1};Password={2};" />
        <add name="DbConn2" connectionString="Data Source={0};User Id={1};Password={2};" />
     </connectionStrings>
    
    <appSettings>
        <add key="userConnName" value="NameOfOracleUser." />
    </appSettings>  
    

    //密切注意 NameOfOracleUser. 中的 .,这取决于您如何设置程序,您将拥有要执行的 OracleDbUserName.StoredProcedure 名称。请注意 Populate_DataGrin 方法中的我正在传递 UserConnName 和string.Concat 将从这里获取 storedProcName public static string storedProcName = "NameOfSomeStoredProc"; 就像一个魅力,如果你有一个存储过程名称的下拉菜单要运行..它会通过根据下拉选择文本分配名称来工作。..

    最后但并非最不重要的一点是,调用 ExecuteDataSet2 的方法/事件看起来像这样

    private void Populate_DataGrin(int intMonth, string strLocation)
    {
        dtSomeDataTable = OracleDBHelper.ExecuteDataSet2(UserConnName, CommandType.StoredProcedure
                   , new OracleParameter("var_IntMonth", intMonth)
                   , new OracleParameter("var_StrLocation", strLocation)
                   , new OracleParameter
                   {
                       ParameterName = "p_cursor"
                     ,
                       OracleDbType = OracleDbType.RefCursor
                     ,
                       Direction = ParameterDirection.Output
                   }
                 ).Tables[0];
    
        YourDataGrid.DataSource = null;
        YourDataGrid.DataSource = dtSomeDataTable;
        YourDataGrid.DataBind();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 2018-10-29
      • 2011-01-10
      • 2010-11-06
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多