首页 > 学院 > 开发设计 > 正文

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

2019-11-17 02:21:43
字体:
来源:转载
供稿:网友

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中。并记录日志。

xml结构概要如下:

<?xml version="1.0" encoding="UTF-8"?><list>  <info>    <id>93ef7c7cccd2ecb13ed01dd6e30020b4136</id>    <title>剔骨刀一握六年练过硬本领 女庖丁解牛割肉有拿手好戏</title>    <posttime class="sql-timestamp">2015-05-25 06:38:20.0</posttime>    <institution>浙江省物价局</institution>    <url>http://dsb.66wz.com/html/2015-05/25/content_1822593.htm</url>    <webName>温州都市报数字版</webName>    <infotype>新闻</infotype>    <summary>内容</summary>    <fl>其他类</fl>  </info>  <info>    ...  </info>  <info>    ...  </info>。。。</list>

1.首先,让我们新建一个解决方案,该解决方案中包含9个项目:

(1)由于需要操作的是Oracle数据库系统,所以在MSDN上找了个Oracle数据操作类库DatabaseLib和DatabaseLink直接拿来用,一个是数据库连接类,一个是数据库操作类,里面包含各种对数据库的操作;

其中,DatabaseLink主要包括以下三个文件:

DbLink.cs

using%20System.Data;namespace%20DataBaseLink{%20%20%20%20///%20<summary>%20%20%20%20///%20DATA%20%20%20%20%20%20:2010-07-01%20%20%20%20///%20Author%20%20%20%20:虞健超(James.Yu)%20%20%20%20///%20Describe%20%20:数据库连接对象%20%20%20%20///%20</summary>%20%20%20%20public%20class%20DbLink%20:%20IDbLink%20%20%20%20{%20%20%20%20%20%20%20%20public%20string%20ConnectionStr%20{%20get;%20set;%20}%20%20%20%20%20%20%20%20public%20DbLink(string%20connectStr)%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20ConnectionStr%20=%20connectStr;%20%20%20%20%20%20%20%20%20}#if%20MSSQL%20%20%20%20%20%20%20%20public%20IDbConnection%20CreateConnection()%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20System.Data.SqlClient.SqlConnection(ConnectionStr);%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20public%20IDataAdapter%20CreateAdapter(IDbCommand%20cmd)%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20System.Data.SqlClient.SqlDataAdapter((System.Data.SqlClient.SqlCommand)cmd);%20%20%20%20%20%20%20%20}#endif%20%20%20%20}}

IDbLink.cs

using%20System.Data;namespace%20DataBaseLink{%20%20%20%20///%20<summary>%20%20%20%20///%20DATA%20%20%20%20%20%20:2010-07-01%20%20%20%20///%20Author%20%20%20%20:虞健超(James.Yu)%20%20%20%20///%20Describe%20%20:连接创建对象借口%20%20%20%20///%20</summary>%20%20%20%20public%20interface%20IDbLink%20%20%20%20{%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20///%20连接字符串%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20string%20ConnectionStr%20{%20get;%20set;%20}%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20///%20创建连接%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20///%20<returns>连接</returns>%20%20%20%20%20%20%20%20IDbConnection%20CreateConnection();%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20///%20创建Adapter%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20///%20<param%20name="cmd">cmd</param>%20%20%20%20%20%20%20%20///%20<returns></returns>%20%20%20%20%20%20%20%20IDataAdapter%20CreateAdapter(IDbCommand%20cmd);%20%20%20%20}}

以及存储过程映射类DBStorePRocedureManager.cs

namespace%20DataBaseLink{%20%20%20%20///%20<summary>%20%20%20%20///%20DATA%20%20%20%20%20%20:2010-07-01%20%20%20%20///%20Author%20%20%20%20:虞健超(James.Yu)%20%20%20%20///%20Describe%20%20:存储过程接口,里面存储存储过程名,以及参数列表方便调用时反射%20%20%20%20///%20</summary>%20%20%20%20public%20interface%20IDbStoreProcedureManager%20%20%20%20{%20%20%20%20%20%20%20%20//存储过程映射,这里是名为SP_TestApply的存储过程%20%20%20%20%20%20%20%20void%20SP_TestApply(string%20c1,%20int?%20c2);%20%20%20%20}}

在这个程序中主要用到前两个类;

而对于数据库操作主要用到以下代码:

OracleDBHelper.cs中的

public%20static%20int%20ExecuteNonQuery(string%20sql,%20OracleParameter[]%20para,%20CommandType%20cmdType)%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20int%20rows%20=%20-1;%20%20%20%20%20%20%20%20%20%20%20%20using%20(OracleConnection%20conn%20=%20new%20OracleConnection(ConnectionString))%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20OracleCommand%20cmd%20=%20new%20OracleCommand(sql,%20conn);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(para%20!=%20null)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmd.Parameters.AddRange(para);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmd.CommandType%20=%20cmdType;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20conn.Open();%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rows%20=%20cmd.ExecuteNonQuery();%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmd.Parameters.Clear();%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20conn.Close();%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20return%20rows;%20%20%20%20%20%20%20%20}

public override unsafe int ExecuteNonQuery()        {            string[] ppOpoPrmRefCtx = null;            IntPtr[] pOpoPrmValCtx = null;            OracleParameter parameter;            int num7;            int num8;            IntPtr zero = IntPtr.Zero;            IntPtr opsSubscrCtx = IntPtr.Zero;            int isSubscrRegistered = 0;            OracleDependency dep = null;            int bQueryBasedNTFNRegistration = 0;            int bchgNTFNExcludeRowidInfo = 0;            long num4 = 0L;            int errCode = 0;            int prmCnt = 0;            bool flag = false;            int bFromPool = 0;            CmdTimeoutCtx state = null;            Timer timer = null;            if (OraTrace.m_TraceLevel != 0)            {                OraTrace.Trace(1, new string[] { " (ENTRY) OracleCommand::ExecuteNonQuery()/n" });            }            if (this.m_connection == null)            {                throw new InvalidOperationException();            }            if (this.m_cmdTxtModified && ((this.m_commandText == null) || (this.m_commandText.Length == 0)))            {                throw new InvalidOperationException(OpoErrResManager.GetErrorMesg(ErrRes.ODP_INVALID_VALUE, new string[] { "OracleCommand.CommandText" }));            }            if (this.m_xmlCommandType != OracleXmlCommandType.None)            {                if (OracleXmlCommandType.Query == this.m_xmlCommandType)                {                    this.ExecuteXmlQuery(false);                    return -1;                }                return this.ExecuteXmlSave();            }            this.CheckConStatus();            if (this.m_cmdTxtModified || (this.m_commandType == System.Data.CommandType.StoredProcedure))            {                if (this.m_commandType == System.Data.CommandType.Text)                {                    this.m_selectStmt = isSelectStatement(this.m_commandText);                    this.m_pooledCmdText = this.m_commandText;                }                else if (this.m_commandType == System.Data.CommandType.TableDirect)                {                    this.m_selectStmt = true;                    this.m_pooledCmdText = "Select * from " + this.m_commandText;                }                else if (this.m_commandType == System.Data.CommandType.StoredProcedure)                {                    this.BuildCommandText();                    this.m_selectStmt = false;                    this.m_utf8CmdText = null;                    this.m_addParam = true;                }                UTF8CommandText text = UTF8CommandText.m_pooler.Get(this.m_connection.m_internalConStr, this.m_pooledCmdText) as UTF8CommandText;                if ((text != null) && (text.m_utf8CmdText != IntPtr.Zero))                {                    this.m_utf8CmdText = text;                    this.m_addParam = this.m_utf8CmdText.m_addParam;                    this.m_parsed = this.m_utf8CmdText.m_parsed;                    bFromPool = 1;                }                if (!this.m_parsed && (this.m_commandType == System.Data.CommandType.Text))                {                    this.ParseCommandText();                }                this.m_cmdTxtModified = false;            }            if (this.m_bindByName && (this.m_commandType != System.Data.CommandType.StoredProcedure))            {                flag = true;            }            if (((this.m_NTFNReq != null) && this.m_NTFNAutoEnlist) && (!this.m_connection.m_contextConnection && (OracleNotificationRequest.s_idTable[this.m_NTFNReq.Id] != null)))            {                opsSubscrCtx = OracleNotificationRequest.PopulateChgNTFNSubscrCtx(this, this.m_addRowid, out dep);                if ((dep != null) && dep.m_bIsRegistered)                {                    isSubscrRegistered = 1;                }                if (dep != null)                {                    if (dep.m_OracleRowidInfo == OracleRowidInfo.Exclude)                    {
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表