2016-03-02 154 views
0

我小的C#软件会在几台服务器上的多个数据库的工作,我需要不同的架构,以便之间切换..
根据当前服务器的ip我连接到掌握指定的服务器上表采用可变 并获取模式名称,然后通过这种方式作为变量添加到连接字符串中。 使用这种方式可以安全地使连接字符串变得灵活吗? 如果没有那么你有什么建议与Oracle数据库连接字符串

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

这是完全可行的我这样做是目前2个不同的Oracle数据库之间进行切换时..你将需要2个连接字符串中的config文件,并在连接字符串中,你需要做这样的事情 'string.Format(“Data Source = {0}; User ID = {1};密码= {2}“'等等...... – MethodMan

+0

我已经一步一步地阐明了如何做到这一点,这就像一个魅力,如果你明白我在'公共字符串UserConnName {'部分的代码你可以看到它是如何动态调用存储过程这是一个例子来帮助你开始.. – MethodMan

回答

0

例如目前我有一个Web应用程序,需要2个不同的连接2网页表单,我会告诉你我怎么有它的2种形式

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

} 

的方法中的实际存储过程调用内1方法将看起来像下面我传递存储Proc名称基于上面声明的一个静态storedProcName ..

创建自己的助手类,你可以有以下的东西,想要执行代码

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

您例如Web.Config中应该是这样的,如果你有2个不同的数据库连接字符串..你会创造同样的方法,上述调用它ExecuteDataSet1....和将DbConn2更改为DbConn并在公共字符串ConnString中将DbConn2更改为其他类中的DbConn2或者有一个复选框,并根据您的选择可以存储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将从这个 public static string storedProcName = "NameOfSomeStoredProc";中挑选storedProcName,就像一个魅力一样,如果你有一个存储的proc名称的下拉列表来运行..它将通过根据drowpdown选择文本分配名称来工作。

最后但并非最不重要的方法/事件调用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(); 
}