【问题标题】:Why OracleDataAdapter is diconnected in C#?为什么 OracleDataAdapter 在 C# 中断开连接?
【发布时间】:2021-11-05 19:01:32
【问题描述】:

我已经使用 winForm 和 cs 创建了数据上传到 Oracle 服务器的应用程序

但是发生了一些无法理解的事情。

每隔大约 30 分钟,应用程序会显示“ORA-03135”错误消息

所以,我添加代码来检查连接状态并在连接未打开时重新打开

但是在 OracleDataAdapter 中出现“ORA-03135”错误,而不是处于连接状态

我不明白这个错误

下面是我的代码

Winform:

    private void comStart()
    {

        try { 
        sp = new SerialPort();
      
        
        sp.PortName = Properties.Settings.Default.comport;
        sp.BaudRate = Properties.Settings.Default.baud;
        sp.DataBits = Properties.Settings.Default.databits;
        sp.Parity = Parity.None;
        sp.StopBits = StopBits.One;
    
         sp.DataReceived += (sender, e) =>
        {
            dynamoData = dynamoData + sp.ReadExisting();

                    if (dynamoData.IndexOf(etx) != -1 && dynamoData.IndexOf(stx) != -1)

             {
                 dynamoData = dynamoData.Substring(dynamoData.IndexOf(stx.ToString()) + 1, (dynamoData.IndexOf(etx.ToString()) - (dynamoData.IndexOf(stx.ToString()) + 1) ));
                 checkData(dynamoData);
             
                 dynamoData = null;
             }
            
       

        };

        sp.Open();
            label79.BackColor = Color.Lime;
        }
        catch (Exception ec)
        {
            label79.BackColor = Color.Red;
        }

    }

    private void checkData(string data)
    {
        sharedDb._db.checkConnection(); //Connection check

        string res_data = null;
        string snNo = null , rname = null , date = null;
        res_data = data;
       string[] each_data = res_data.Split(';');

       this.Invoke(new MethodInvoker(delegate() { 

        label13.Text = date = each_data[1]; 
        label18.Text = each_data[2]; 
        rname = dataGridView2.Rows[0].Cells[0].Value.ToString();
        label20.Text = snNo = dataGridView2.Rows[0].Cells[0].Value + "R" + each_data[0]; 
        label21.Text = each_data[3]; 
        label84.Text = each_data[4].Split('_')[0]; 

        OK_NG(label62 , each_data[4].Split('_')[1]); 

        
        label6.Text = each_data[5].Split('_')[0]; 
        OK_NG(label10, each_data[5].Split('_')[1]); 


        }));

       
        if (each_data[5].Split('_')[1].Equals("OK") && each_data[3].Equals(dataGridView2.Rows[0].Cells[1].Value.ToString()))
        {
            int res = sharedDb._db.insertData(res_data , rname , snNo , "0123456789"); //insert comport string Data

            if (res == 1) //insert result..
            {
               

                insertHistory(snNo , date ); //add history Data

                setlabelData( Convert.ToDateTime(date).ToString("yyyy.MM.dd") , snNo);

               label75.Text = each_data[0].Split('A')[1].ToString();


            }

        }else
        {
            
            OK_NG(label64, "NG"); 
        }


   }

CS(共享数据库):

public static class sharedDb
    {
        public static db _db = null;

        public static void initDB()
        {
            _db = new db();
        }
    }

CS(分贝):

 class db(){
 public  void connectdb()
        {


            connected = true;
            orc = new OracleConnection(connect_url);
            orc.Open();
            setDbAdapter();


        }
  public void checkConnection()
        {
            try
            {
                if (orc.State != ConnectionState.Open)
                {
                   
                    orc.Open();
                    setDbAdapter();
                }
            }
            catch (OracleException ex)
            {
                MessageBox.Show("checkConntion Error Message :" + ex.Message);
            }
        }

        private void setDbAdapter()
        {
            oda = new OracleDataAdapter();
           
            oda.SelectCommand = orc.CreateCommand(); 
            oda.InsertCommand = orc.CreateCommand(); 
            oda.UpdateCommand = orc.CreateCommand(); 
            oda.DeleteCommand = orc.CreateCommand(); 
          
        }
  public int insertData(string data , string rname , string snNo , string cname)
        {
            int res = 0;
            checkConnection();

            try
            {
              
                string insertQuery = null;
                string[] each_data = null;

                each_data = data.Split(';');

                

                insertQuery = "insert into FE_DATA values ( null , null , null , null , '" + rname + "','" + cname + "', '" + each_data[1] + "','" + each_data[2] + "', '" + snNo + "','','" + each_data[3] + "',";

                for (int i = 4; i < each_data.Length - 2; i++)
                {
                    insertQuery += "'" + each_data[i].Split('_')[0] + "','" + each_data[i].Split('_')[1] + "',";
                }

                insertQuery = insertQuery + "'" + each_data[17].Split('_')[1] + "')";
               

                 oda.InsertCommand.CommandText = insertQuery;
                 res = oda.InsertCommand.ExecuteNonQuery();
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message); //'ORA-03135' Error
            }
            
            return res;
        }
       
}

【问题讨论】:

  • 我认为我的第一个停靠点是看看为什么我的连接打开了 35 分钟!
  • 您使用的是哪个版本的 Oracle?报告了此错误的错误
  • Oracle版本是11g ..是什么bug??连接时间对我来说无关紧要,因为我检查连接状态并在连接关闭时重新打开

标签: c# oracle winforms


【解决方案1】:

oracle 错误 ORA-03135 经常发生在防火墙终止连接时。

本网站提供了一些关于如何尝试缓解这种情况的建议: http://www.dba-oracle.com/t_ora_03135_connection_lost_contact.htm

过去,我们遇到过长时间运行的查询被网络超时的问题,我们的网络管理员不得不为我们设置例外情况。

【讨论】:

  • 当然防火墙端口也在客户端电脑和服务器上打开'1521'。但是服务器和客户端 PC 的 IP 频段是不同的。这是问题吗??我应该检查什么??
  • 端口显然是开放的,否则根本无法连接。但是某处的防火墙会在 30 分钟后断开您的连接。它可能在您的客户端 PC、服务器或网络中的某个地方。因此,您需要检查这一点并与您的网络管理员交谈,看看文章中的建议是否有帮助。
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多