【问题标题】:removing form from c# code?从 C# 代码中删除表单?
【发布时间】:2013-04-02 22:48:44
【问题描述】:

我对 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();
            }
        }
    }

【问题讨论】:

  • 什么是'run on open'?
  • 是否需要在表单窗口中?您可以使用命令行项目轻松完成此操作。
  • 不,我只是在窗体窗口中完成的,因为在线示例是从这些开始的。我想用 Windows 任务调度程序安排这个,每 30 分钟运行一次......命令行项目是否适合这个?
  • 是的 - 我建议创建一个新的 C# 命令行项目,然后将上面的代码复制到其中。您不需要所有的 using 包;大概System.DrawingSystem.Windows.FormsSystem.Threading.Tasks 可以去。尝试一次删除一个,然后进行构建。如果您遇到构建错误,只需放回您刚刚删除的using。或者你可以把它们留在那里——我很确定它们是无害的(除了可能会误导)。
  • 在创建命令行/控制台项目时,只需复制button1_Click方法中的代码即可。

标签: c# winforms oracle


【解决方案1】:

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

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

记得设置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 的返回值转换为您的记录计数变量。

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

【讨论】:

  • 宾果游戏!不过有一件事……最后截断表似乎不起作用……我可以正常运行c#而没有错误,但它不会截断……我用截断语句更新了上面的代码跨度>
  • 是的,您不运行第二个命令文本。设置命令后需要调用cmd.ExecuteNonQuery();
  • 看起来像这样吗? cmd.ExecuteNonQuery = "TRUNCATE TABLE ZDMSN.TRIGGER_TEST" ?
  • 还有一件事...我在 int cnt = (int)cmd.ExecuteScalar(); 处收到 InvalidCastException嗯嗯......我真的需要把这些东西捡起来
  • 好吧 COUNT(*) 应该返回一个整数,但是你之前有所有的转换,可能在 Oracle 提供程序中有一些东西。需要检查。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2012-09-10
    • 2020-02-26
    相关资源
    最近更新 更多