【问题标题】:creating a common oracle database connection using a single form c# for several forms使用单个表单 c# 为多个表单创建一个通用的 oracle 数据库连接
【发布时间】:2017-09-11 05:18:26
【问题描述】:

我在一个表单(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();

【问题讨论】:

  • 告诉我们异常的类型没什么意义,告诉我们 .Message 属性值会更有用..
  • 我收到“附加信息:此操作必须打开连接”
  • 为什么不能使用它自带的Form2的单独连接?
  • 附言;对于它的价值,几乎没有关于这段代码或问题是它应该完成的方式 - 你说你试图在一个表单上建立一个公共连接,但是你有两个表单,你重新创建而不是回收连接,您永远不会关闭它,也不会关闭/处置您的阅读器,并且正确设计的程序在其按钮单击处理程序中永远不会有数据库访问代码。遵循一个关于现代数据库访问方法(nhibernate、实体框架、数据集/表适配器)的好教程将是您现在可以做的最好的事情;扔掉这段代码
  • @ChetanRanpariya 我从 Form1 获得用户名和相关详细信息!所以我必须为 Form2 使用在 Form1 中创建的连接

标签: c# oracle exception connection


【解决方案1】:

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

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

考虑有一个帮助类,它将连接对象维护为其中的静态对象。您可以在一个地方设置并在另一个地方检索它。

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

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

【讨论】:

  • Thanx 但我收到错误消息“由于对象的当前状态,操作无效。”突出显示 OracleDataReader dr = cmd.ExecuteReader();部分
  • 哪一行代码出错?您是否按照我建议的方式编写代码?我刚刚更新了我的答案。它有一些明显的问题。我修好了。
  • OracleDataReader dr = cmd.ExecuteReader();
  • 异常的信息是什么?有任何内部异常吗? InnerException 的信息是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多