首页 > 解决方案 > Windows 服务的 C# 代码在执行 ExecuteReader() 期间抛出异常

问题描述

在执行 Windows 服务的 C# 代码时,executereader 函数读取SELECT查询代码抛出异常

“由于对象的当前状态,操作无效。

我已经使用相同的代码在 Windows 窗体的 C# 代码中连接到 oracle 数据库。那里一切都很好。我什至使用了 ExecuteNonQuery 函数,但没有任何帮助。

namespace test
{
    public partial class Service1 : ServiceBase
    {
        Timer timer = new Timer();
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            System.Diagnostics.Debugger.Launch();
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = 10000;
            timer.Enabled = true;
            ccpwrm();
        }

        protected override void OnStop()
        {
            timer.Enabled = false;
        }

        public static void ccpwrm()
        {
            OracleConnection con = new OracleConnection("User Id=ISCRMRT;Password=ISCRMRT;Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = tcp)(HOST = Level-2-Gateway)(PORT = 1521)) (CONNECT_DATA =(SERVICE_NAME = LEVEL2)))");
            OracleCommand comnd = new OracleCommand();

            con.Open();
            comnd.CommandText = "select * from CCP_BILLET";
            OracleDataReader read = comnd.ExecuteReader();
            while (read.Read())
            {
                FileStream fs = new FileStream(@"d:\TestServiceLog.txt", FileMode.OpenOrCreate, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.BaseStream.Seek(0, SeekOrigin.End);
                sw.WriteLine(read[0].ToString().TrimEnd());
                sw.WriteLine(read[4].ToString().TrimEnd());
                sw.Flush();
                sw.Close();
            }
            con.Close();
        }

        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            ccpwrm();
        }

    }
}

我希望将 oracle 表中的选定列写入文件,但代码总是停留在同一点,即ExecuteReader()语句。

标签: c#oracleservice

解决方案


我相信这个问题是因为 OracleCommand 与 OracleConnection 没有关联。

尝试在 OracleCommand 构造函数中传递连接,或设置 Connection 属性。

OracleCommand comnd = new OracleCommand("select * from CCP_BILLET", con);

或者

comnd.Connection = con;

请参阅:https ://docs.microsoft.com/en-us/dotnet/api/system.data.oracleclient.oraclecommand?view=netframework-4.8


推荐阅读