0

我对 C# 非常陌生,除了 SQL 之外的任何东西都可以编程。我已经在表单和按钮单击上发生了以下代码。如果我只想让它在 open 上运行,我会怎么做?如您所知,我对 C# 非常陌生(今天才开始学习它,但它非常令人兴奋!)

        using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
    using Oracle.DataAccess.Types;

    namespace OraTrigger
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                string oradb = "Data Source=OMP1;User Id=user;Password=pass;";

                OracleConnection conn = new OracleConnection(oradb); // C#

        conn.Open();

        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        cmd.CommandText = "SELECT cast(Count(*) as varchar(20)) as trig FROM ZDMSN.TRIGGER_TEST";
        //cmd.CommandType = CommandType.Text;

        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();

        int cnt;
        if (int.TryParse(dr.GetString(0), out cnt))
        {
            if (cnt > 0)
            {
                System.Diagnostics.Process.Start(@"C:\testfile.bat");                    
            }
        }
        cmd.CommandText = "TRUNCATE TABLE ZDMSN.TRIGGER_TEST";
        conn.Dispose();
            }
        }
    }
4

2 回答 2

3

如果您需要将代码作为计划任务运行,那么命令行应用程序更合适。

只需创建一个新项目并选择Console Application. 然后将所有按钮单击代码移动Main到 Visual Studio IDE 为您编写的方法中。

请记住设置对 Oracle ODP.NET 库的引用并导入相关的 using 语句

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
using Oracle.DataAccess.Types;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string oradb = "Data Source=OMP1;User Id=user;Password=pass;";
            using(OracleConnection conn = new OracleConnection(oradb))
            using(OracleCommand cmd = new OracleCommand("SELECT Count(*) as trig FROM ZDMSN.TRIGGER_TEST", conn))
            {
                conn.Open();
                int cnt = (int)cmd.ExecuteScalar();
                if (cnt > 0)
                {
                    System.Diagnostics.Process.Start(@"C:\testfile.bat");
                    cmd.CommandText = "TRUNCATE TABLE ZDMSN.TRIGGER_TEST";
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}

我还修改了您的代码以从数据库中获取单个值。对于这种情况,使用 Command.ExecuteScalar 方法就足够了,该方法返回从您的 sql 命令文本获得的第一行的第一列。因为 count(*) 应该始终返回单行,所以您可以轻松地将 ExecuteScalar 的返回值转换为您的记录计数变量。

编辑我已将逻辑添加到 TRUNCATE 所涉及的表。请注意,您应该使用此处提供的代码。您的代码可能会失败,因为您有一个打开的 DataReader,并且当 DataReader 打开时,您无法执行其他命令(对于没有启用多个活动结果集的 SqlServer 来说,这是真的,我真的不知道这个规则是否也适用于 Oracle NET提供者)

于 2013-04-10T21:50:04.783 回答
1

订阅ShownLoad表单事件并将您的代码移动到该事件处理程序。

另外我建议将您的代码提取到一些与数据访问相关的类,或者至少提取到单独的方法。并从事件处理程序调用该方法。

于 2013-04-10T21:42:54.903 回答