从c#代码中删除表单?

时间:2013-04-10 21:41:46

标签: c# winforms oracle

我对C#非常陌生,除了SQL之外还编程任何东西。我已经在表单上和单击按钮上获得了以下代码。如果我想让这个运行开放,我该怎么做?我对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();
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

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

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

Rembember设置对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提供商)

答案 1 :(得分:1)

订阅ShownLoad表格事件,并将您的代码移至该事件处理程序。

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