现况:现有程序被排在服务器的每日执行任务计划中,程序功能是下载web端的一个文件,然后塞入到数据库中。
问题:不知道什么原因,偶尔发现服务器任务执行失败情况,导致某一天的数据缺失。
需求:每隔三天检查一次数据是否存在,如果不存在,则指定日期重新下载一次。
第一步:写一个操作数据库的类
namespace DEMO2616
{
public class OracleDBlink
{
string connStr = "User Id=LIRUPENG;Password=Lrp19961013..;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"; //连接字符串
OracleConnection dblink;
public OracleDBlink() //构造方法,new即调用
{
try
{
dblink = new OracleConnection(connStr); //先new一个OracleConnection 把连接字符串传过去。
dblink.Open(); //调用方法.连接
}
catch (OracleException ex) //异常处理
{
dblink.Close();
throw new Exception(ex.Message);
}
finally
{
if (dblink.State != ConnectionState.open)
{
dblink.Close();
}
}
}
public DataSet Query(string sql) // 查询操作 ,传入sql字符串
{
DataSet datatable = new DataSet(); //先new一个dataset放数据
OracleDataAdapter data = new OracleDataAdapter(sql,dblink); //new一个DataAdapter 按照sql语法把数据从数据库中提取出来。
data.Fill(datatable); //把提取出来的数据放到datatable中
return datatable; //返回提取出来的数据
}
public int curd(string sql) //delete insert update create 操作 同样传入SQL字符串
{
OracleCommand curd = new OracleCommand(sql);
int i = curd.ExecuteNonQuery();
return i; //返回影响的行数 -1代表失败
}
public bool Exists(string sql,OracleParameter[] op) //判断数据是否存在
{
OracleCommand exists = new OracleCommand(sql,dblink);
object obj= exists.ExecuteScalar(); //返回一个对象。第一条数据的第一列
if ((object.Equals(obj, null)) || (object.Equals(obj, System.DBNull.Value)))
{
return false;
}
else
return true;
}
}
}
第二步:检查数据是否存在,然后再进行下载,或者再执行原本程序。
namespace DEMO2616
{
public partial class download : Form
{
public download()
{
InitializeComponent();
}
[DllImport("kernel32")] //操作ini文件一定要先声明这一段
public static extern void WritePrivateProfileString(string sectionName, string key, string value, string filePath);
OracleDBlink SQLquery = new OracleDBlink(); //先new数据库连接类。
DataSet table = new DataSet(); //承接查询出来的数据。
string sql; //SQL语句
private void button1_Click(object sender, EventArgs e)
{
string date=DateTime.Now.ToString("yyyyMMdd");
string pos = "WHRKZFB20000002";
string urlpath;
string savepath;
string filelayout;
string inipath= System.Environment.CurrentDirectory; //获取当前路径
//OracleParameter[] oparam = {new OracleParameter("date", OracleDbType.Varchar2),
//new OracleParameter("pos", OracleDbType.Varchar2)}; //Oracle SQL语句参数。
//oparam[0].Value = date;
//oparam[1].Value = pos;
for (int i = 1; i <=3; i++)
{
date = DateTime.Now.AddDays(-i).ToString("yyyyMMdd");
sql = "select * FROM whrk.yy_bank_detail where BANKLIQUIDATIONDATE='" +date+"'and BANKMERCHANTNO='"+pos+"'";
if (SQLquery.Exists(sql,oparam)) // 判断数据是否存在(true)
{
return;
}
else
{
date = date.Substring(1, 4) + "-" + date.Substring(4, 6) + "-" + date.Substring(6, 8);
inipath = inipath + @"D:\WorkSpace\刘普20190725日更新支付宝支付\whrk_Download\download.ini";
SetValue("WIN", "is_dateno","1", inipath); //改ini文件
SetValue("WIN", "is_date", date, inipath);
//System.Diagnostics.Process.Start(@"D:\WorkSpace\刘普20190725日更新支付宝支付\whrk_download.exe");//执行程序
SetValue("WIN", "is_dateno", "0", inipath);
//下载流水文件
for (int k = 1; k < 3; k++)
{
if (k == 1) filelayout = "_1.txt";
else filelayout = "_68.xls";
urlpath = @"ftp://uisftp.chinaums.com/build/10210002730000_" + date + filelayout;
savepath = @"G:\WorkSpace\学习文档\" + date + filelayout;
downloadfile("10210002730000", "Ab123456", urlpath, savepath); //账户,密码,目标路径,本地路径。
}
}
}
public void downloadfile(string userName,string password,string url,string savepath) //下载url 中文件;//参数分别为:账户,密码,目标路径,本地路径。
{
WebClient webclient = new WebClient();
webclient.Encoding = Encoding.UTF8;
webclient.Credentials = new NetworkCredential(userName, password);
webclient.DownloadFile(url,savepath);
}
public static bool SetValue(string sectionName, string key, string value, string filePath) //操作INI配置文件
{
WritePrivateProfileString(sectionName, key, value, filePath);
return true;
}
private void button3_Click(object sender, EventArgs e) //执行外部程序测试。
{
System.Diagnostics.Process.Start(@"C:\QQmusic\QQMusic.exe");
MessageBox.Show("执行成功");
}
}
}