我对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();
}
}
}
答案 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)
订阅Shown
或Load
表格事件,并将您的代码移至该事件处理程序。
另外,我建议将代码提取到某些与数据访问相关的类,或者至少提取单独的方法。并从事件处理程序调用该方法。