2013-04-10 3 views
0

Я чрезвычайно новичок в C# и программирую все, кроме SQL. Я получил приведенный ниже код в форме и нажатием кнопки. Если бы я хотел просто сделать этот запуск открытым, как бы я это сделал? Я новичок в C#, как вы можете сказать (только начал сегодня изучать его, но его очень интересно!)удалять форма c 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(); 
      } 
     } 
    } 
+0

Что вы подразумеваете под «пробегом на открытом воздухе»? – Steve

+0

Нужно ли быть в окне форм? Вы можете легко сделать это с помощью проекта командной строки. –

+1

нет, я просто сделал это в виде окон, потому что онлайн-пример начался с них. Я хочу запланировать это с помощью планировщика задач Windows для запуска каждые 30 минут ... будет ли проект командной строки идеальным для этого? – user2061886

ответ

2

Если вам нужно запустить свой код в качестве запланированной задачи, то приложение командной строки более подходит.

Просто создайте новый проект и выберите Console Application. Затем переместите весь код нажатия кнопки внутри метода Main, написанного для вас с помощью Visual Studio IDE.

Rembember установить ссылки на библиотеки Oracle ODP.NET и импортировать соответствующий используя операторы

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 в свою переменную счетчика записей.

EDIT Я добавил логику, чтобы TRUNCATE задействовала таблицу. Пожалуйста, обратите внимание, что вы должны использовать приведенный здесь код. Ваш код, скорее всего, не сработает, потому что у вас есть открытый DataReader, и когда открыт DataReader, вы не можете выполнять другие команды (это верно для SqlServer без активации множества активных наборов результатов, я действительно не знаю, применимы ли эти правила к Oracle NET Провайдер)

+0

BINGO! одна вещь, хотя ... обрезать таблицу в конце, похоже, не работает ... Я могу запустить C# отлично, без ошибок, но это не усекает ... Я обновил вышеуказанный код с помощью инструкции truncate – user2061886

+0

Да , вы не запускаете второй командный текст. Вам нужно вызвать 'cmd.ExecuteNonQuery();' после установки команды – Steve

+0

, так выглядит ли это? CMD.ExecuteNonQuery = "TRUNCATE TABLE ZDMSN.TRIGGER_TEST"? – user2061886

1

Подписаться на Shown или Load события формы и переместить код обработчика событий.

  • Form.Shown Event Происходит при каждом обращении к форме.
  • Form.Load Event Происходит, прежде чем форма будет показана в первый раз.

Также я предлагаю извлечь ваш код для некоторого класса, связанного с доступом к данным, или, по крайней мере, для разделения метода. И вызовите этот метод из обработчика события.

Смежные вопросы