如何将SID和端口包含在Oracle连接字符串中?

7

我想在连接字符串中指定端口和SID。在运行以下代码之后:


public static string ConnectionString
{
    get
    {
        string host = Config.CsHost;
        string sid = Config.CsSID;
        string port = Config.CsPort;
        string user = Config.CsUser;
        string pass = Config.CsPassword;
        return String.Format(@"Data Source = {0}:{1}\{2}; Persist Security Info = True; User Id = {3}; Password = {4}; Unicode = True", host, port, sid, user, pass);
    }
}

...

using (OracleConnection connection = new OracleConnection(ConnectionString))
{
    try
    {
        connection.Open();

Open()方法没有响应……我认为问题出在sid上。可能的问题是什么?

更新: 我应该使用这种连接字符串,但是我无法很好地解释它。

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID))); User Id=myUsername;Password=myPassword;

有人可以帮我解释一下吗?


2
http://www.connectionstrings.com/ - OldProgrammer
4个回答

7
我需要将SERVICE_NAME替换为SID,因此如下所示:

return String.Format("SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SID={2})));uid={3};pwd={4};", host, port, sid, user, pass);

做到了。

6
为避免TNS格式问题,请尝试以下方法:
Data Source = server:port/SID; User ID = user; Password = mypwd

1
我认为只有当你的SID与服务名称匹配时,这才有效。 - Kevin Dimey

5

让我们来看一下你这里的内容

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID))); 
User Id=myUsername;
Password=myPassword;

这是一个 .net 连接字符串。
这里是连接字符串的一部分。
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID))) 

Oracle客户端连接到SID所需的内容。这部分也可以在TNS Names文件中进行配置。在这种情况下,您将拥有类似于以下内容:

MyOraDbConnection = (DESCRIPTION=(ADDRESS_LIST=...

那么你的.net代码将如下所示:

string connStr = "Data Source=MyOraDbConnection;User Id=myUsername;Password=myPassword;"

2

现在,看起来你想要动态地做一些事情。通常,人们会将一堆文本框的值连接起来,如下所示:

string dataSource = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + txtDbServer.Text + ...

另一种方式是:
string dataSource = string.Format("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={2})))",
    txtDbServer.Text,
    txtPort.Text,
    txtSid.Text);

或者,您可以创建ConnStr对象,它不仅可以连接字符串,还可以保存您的连接字符串- 伪代码如下:

class ConnStr
{
    string Server {get;set;}
    string Port {get;set;}
    string Sid {get;set;}
    // more properties

    string GetConnectionString()
    {
        // return your compiled string
    }

    void Save(string switches)
    {
        // Save your string to different places. 
        // For example 
        //      /f myconnfile.txt - will save to application root directory
        //      /f c:\xxx\myconnfile.txt - will save to specific directory
        //      /s myconnsetting  - will save to settings
    }

    void Load(string switches)
    {
        // Load your string from sources. 
    }
}

这需要更多的工作,但也更加灵活

0

请尝试使用此连接字符串:

User Id=[user];Password=[pass];Server=[server];Direct=True;Sid=[sid];Port=[port];Persist Security Info=True

System.Data.OracleClient 抛出异常,说直接和 Sid 不是关键字... 无论如何还是谢谢。 - Mitulát báti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接