0

私は 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();
            }
        }
    }
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();
                }
            }
        }
    }
}

また、データベースから単一の値を取得するようにコードを修正しました。この場合、SQL コマンド テキストから取得した最初の行の最初の列を返す Command.ExecuteScalar メソッドを使用するだけで十分です。count(*) は常に単一の行を返す必要があるため、ExecuteScalar の戻り値をレコード カウント変数に簡単にキャストできます。

EDIT関連するテーブルをTRUNCATEするロジックを追加しました。ここで提供されるコードを使用する必要があることに注意してください。開いている DataReader があり、DataReader が開いていると他のコマンドを実行できないため、コードはおそらく失敗します (これは、複数のアクティブな結果セットが有効になっていない SqlServer に当てはまります。このルールが Oracle NET にも適用されるかどうかはわかりません)。プロバイダー)

于 2013-04-10T21:50:04.783 に答える
1

ShownまたはフォームのイベントをサブスクライブしLoad、コードをそのイベント ハンドラーに移動します。

また、コードをデータアクセス関連のクラスに抽出するか、少なくともメソッドを分離することをお勧めします。そして、イベント ハンドラからそのメソッドを呼び出します。

于 2013-04-10T21:42:54.903 に答える