C# 脚本在不应该运行时运行执行行

Posted

技术标签:

【中文标题】C# 脚本在不应该运行时运行执行行【英文标题】:C# script running execute line when it shouldn't 【发布时间】:2013-04-19 12:41:23 【问题描述】:

我是 C# 编程新手。我编写了一个查询 oracle dB 的脚本,如果行数 > 0,它应该运行一个 bat 文件,但如果不是,它应该结束。

这是我目前写的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
using Oracle.DataAccess.Types;

namespace trigOra

    class Program
    
        static void Main(string[] args)
        
            string oradb = "Data Source=OMP1;User Id=user;Password=pwd;";

            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 DMSN.DS3R_1XRTT_VOICE_TRIGGER";
            //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:\AutoBatch\backup\trigger.bat");
                    cmd.CommandText = "TRUNCATE TABLE DMSN.DS3R_1XRTT_VOICE_TRIGGER";
                    cmd.ExecuteNonQuery();
                
            
            conn.Dispose();

        
    

代码可以正常工作,只是它似乎总是执行这部分:

if (cnt > 0)

    System.Diagnostics.Process.Start(@"C:\AutoBatch\backup\trigger.bat");
    cmd.CommandText = "TRUNCATE TABLE DMSN.DS3R_1XRTT_VOICE_TRIGGER";
    cmd.ExecuteNonQuery();

即使返回的行数为 0。hmmmm...

【问题讨论】:

为什么需要cast as varchar?你可以改用dr.GetInt32/64() 另外,您似乎需要使用Process.Start(...).WaitForExit(),否则您将在备份完成之前运行 truncate。 尝试初始化 int cnt = 0;然后看看 我怀疑你的 Count 返回超过 0 @DanilaPolevshikov 我的值返回 0 【参考方案1】:

您的 bat 文件必须使用 WaitForExit() 函数运行:

int exitCode = RunProcessForExitCode(filename, arguments);

    private static int RunProcessForExitCode(string processFilename, string processArguments)
    
        //make process output possible to machine-reading
        Process process = new Process
        
            StartInfo = new ProcessStartInfo
            
                FileName = processFilename,
                Arguments = processArguments,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                CreateNoWindow = true
            
        ;
        process.Start();
        Console.Write(process.StandardOutput.ReadToEnd());
        process.WaitForExit();
        return process.ExitCode;
    

【讨论】:

以上是关于C# 脚本在不应该运行时运行执行行的主要内容,如果未能解决你的问题,请参考以下文章

在命令行中使用 WbExport 时缺少数据和 sql 脚本文件

启用以在不使用 CLI 的情况下运行的 Python 脚本不采用命令行参数

如何从 Windows 服务运行控制台应用程序?

C# 中未获取 Powershell 结果集

运行节点 bin 脚本时确定命令行工作目录

如何在不使用命令行的情况下运行 Perl 脚本?