使用单一表单 c# 为多个表单创建一个通用的 oracle 数据库连接

creating a common oracle database connection using a single form c# for several forms

我已经在一种形式 (Form1) 中创建了一个 oracle 数据库连接,并在另一种形式 (Form2) 中使用了相同的连接来从数据库中检索一些数据!但是在尝试检索数据时出现错误未处理的异常在第二种形式的标签上!

form1的代码如下(运行正常!)

 public void connection()
        {
            con = new OracleConnection("Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST ="+ip.Text+")(PORT ="+port.Text+"))) " +
            " (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = ora12c) )" +
        " ); User Id =" + uname.Text + "; password=" + pword.Text);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            connection();
            con.Open();

                Form2 f2 = new Form2();
                f2.Show();


        }

第二种形式的代码2

private void button1_Click(object sender, EventArgs e)
        {
            Form1 f1 = new Form1();
            f1.connection();
            f1.con.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.CommandText = "Select name from username";
            cmd.Connection = f1.con;
            OracleDataReader dr = cmd.ExecuteReader();
            dr.Read();
            label1.Text = dr.GetString(0);
        }

当我输入详细信息(用户名、密码等)并单击 form1 中的 lgin 按钮时,我可以访问 form2,但是在 form2 中,当我单击加载按钮时出现错误 "An unhandled exception of type 'Oracle.DataAccess.Client.OracleException' occurred in Oracle.DataAccess.dll" 突出显示 f1.con.Open();

您正在 button1_Click1 ofForm2. Due to this the connection string inf1.connection1is generated using blank values of the text boxes ofForm1` 中创建 Form1 的新实例。

要解决此问题,您需要确保在 Form1.connection 方法中创建的连接应存储在某个地方,以便您也可以在 Form2 中使用相同的连接。

考虑使用一个助手 class 将连接对象作为静态对象维护在其中。您可以在一个地方设置并在其他地方检索它。

public static class DatabaseHelper
{
    private static OracleConnection oracleConnection;

    private static string connectionStringTemplate = "Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST ={0})(PORT ={1}))) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = ora12c) ) ); User Id ={2}; password={3}";

    public static void SetConnection(string ipAddress, string portNumber, string userName, string password)
    {
        var connectionString = string.Format(connectionStringTemplate, ipAddress, portNumber, userName, password);

        oracleConnection = new OracleConnection(connectionString);
    }

    public static void SetConnection(string connectionString)
    {
        oracleConnection = new OracleConnection(connectionString);
    }

    public static OracleConnection GetConnection()
    {
        return oracleConnection;
    }
}

现在您可以使用 Form1 中的调用 DatabaseHelper.SetConnection 方法来设置连接。

private void button1_Click(object sender, EventArgs e)
{
    DatabaseHelper.SetConnection(ip.Text,port.Text, uname.Text, pword.Text);
    Form2 f2 = new Form2();
    f2.Show();
}

然后在 Form2 中检索并重用连接,如下所示。

private void button1_Click(object sender, EventArgs e)
{
    OracleConnection con = DatabaseHelper.GetConnection();

    OracleCommand cmd = new OracleCommand();
    cmd.CommandText = "Select name from username";
    cmd.Connection = con;
    con.Open();
    OracleDataReader dr = cmd.ExecuteReader();
    dr.Read();
    label1.Text = dr.GetString(0);
}

这应该可以帮助您解决问题。