一 本系列随笔目录及本节代码下载

自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱。同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的。

该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。

本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持。

很多初学者常有此类困惑,“为什么我书也看了,C#相关的各个方面的知识都有所了解,但就是没法写出一个像样的应用呢?”,

这其实还是没有学会综合运用所学知识,锻炼出编程思维,建立起学习兴趣,我想该系列文章也许会帮到您,但愿如此。

开发环境:VS2008

本节源码位置:https://github.com/songboriceboy/GatherAllStoreInDB

源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/GatherAllStoreInDB

系列文章提纲如下:

二 第六节主要内容简介(将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示)

将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示的解决方案,演示demo如下图所示:可执行文件下载

与上节的demo不同在于,上节我们得到的某个博主的全部博文被保存在DataTable(内存)中,程序关闭后,全部下载下来的博文全都没了,下次还需要重新下载,这样明显不好。

这次我们将下载的博文存在sqlite数据库中,每新增一个博主,程序会自动在执行文件所在的文件夹下的WebSiteDB子目录中创建一个以博主ID命名的.db文件,该数据库是sqlite数据库。

程序加载的时候会自动去执行文件所在的文件夹下的WebSiteDB子目录扫描,在ComboBox下拉中列出扫描到数据库名字,点击某一个下拉项,程序自动加载该数据库中的文章表中的全部数据到DataGridView显示,点击DataGridView的某一项,可以在下部的WebBrower中浏览网页。

三 基本原理

我们为某个博主的全部博文定义了一张数据库表,表结构如下:

   string m_strCreatTable = @"--1-2 层节点表(AU_LayerNode)
drop table if exists [AU_LayerNode];
CREATE TABLE AU_LayerNode(
AU_LayerNodeID INT NOT NULL PRIMARY KEY,
AU_ParentLayerNodeID INT NOT NULL DEFAULT 0,
AU_UrlAddress VARCHAR(1000) NOT NULL DEFAULT '',
AU_UrlTitle NVARCHAR(1000) NOT NULL DEFAULT '',
AU_UrlContent NTEXT NOT NULL DEFAULT '',
AU_UrlLayer INT NOT NULL DEFAULT 0,
AU_IsVisit INT NOT NULL DEFAULT 0,
AU_RemoveSameOffset1 INT NOT NULL DEFAULT 0,
AU_RemoveSameOffset2 INT NOT NULL DEFAULT 0,
AU_LastUpdateDate DATETIME NOT NULL DEFAULT '2012-01-01', AU_ReserveInt1 INT NOT NULL DEFAULT 0,
AU_ReserveInt2 INT NOT NULL DEFAULT 0,
AU_ReserveInt3 INT NOT NULL DEFAULT 0,
AU_ReserveInt4 INT NOT NULL DEFAULT 0,
AU_ReserveInt5 INT NOT NULL DEFAULT 0,
AU_ReserveInt6 INT NOT NULL DEFAULT 0,
AU_ReserveInt7 INT NOT NULL DEFAULT 0,
AU_ReserveInt8 INT NOT NULL DEFAULT 0, AU_ReserveStr1 VARCHAR(1000) NOT NULL DEFAULT '',
AU_ReserveStr2 VARCHAR(1000) NOT NULL DEFAULT '',
AU_ReserveNStr1 NVARCHAR(1000) NOT NULL DEFAULT '',
AU_ReserveNStr2 NVARCHAR(1000) NOT NULL DEFAULT '', AU_ReserveTEXT1 TEXT NOT NULL DEFAULT '',
AU_ReserveTEXT2 TEXT NOT NULL DEFAULT '',
AU_ReserveTEXT3 TEXT NOT NULL DEFAULT '',
AU_ReserveNTEXT1 NTEXT NOT NULL DEFAULT '',
AU_ReserveNTEXT2 NTEXT NOT NULL DEFAULT '',
AU_ReserveNTEXT3 NTEXT NOT NULL DEFAULT '', AU_ReserveDateTime1 DATETIME NOT NULL DEFAULT '2012-01-01',
AU_ReserveDateTime2 DATETIME NOT NULL DEFAULT '2012-01-01',
AU_ReserveDateTime3 DATETIME NOT NULL DEFAULT '2012-01-01',
AU_ReserveDateTime4 DATETIME NOT NULL DEFAULT '2012-01-01', AU_ReserveDecmial1 DECIMAL NOT NULL DEFAULT 0,
AU_ReserveDecmial2 DECIMAL NOT NULL DEFAULT 0
); ";

其中最重要的是AU_UrlAddress,AU_UrlTitle,AU_UrlContent这3个字段,分别表示博文链接地址,博文标题,博文正文内容。

接下来,对比上节内容,我们在新增博主下载的功能函数中增加了以下几行代码:

private Cls_SqliteMng m_sqliteMng = new Cls_SqliteMng();
string m_connStr1 = @"Data Source=" + Application.StartupPath + @"\WebSiteDB\";
string m_connStr2 = @";Initial Catalog=sqlite;Integrated Security=True;Max Pool Size=10";

private string m_strInsertTaskInitData = @"insert into [AU_LayerNode] values(0, 0, '#^$BlogID$^#','', '', 0, 0, 0, 0
, '2012-01-01', 0, 0, 0, 0, 0, 1, 1, 0,'', '','', '','', '','', '','', '', '2012-01-01', '2012-01-01', '2012-01-01', '2012-01-01', 1, 0)";

 m_sqliteMng.CreateDB(m_strDBFolder + this.toolStripTextBox1.Text + ".db");
m_sqliteMng.ExecuteSql(m_strCreatTable
, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2); string strInsertTaskInitData = m_strInsertTaskInitData.Replace("#^$BlogID$^#", this.toolStripTextBox1.Text); m_sqliteMng.ExecuteSql(strInsertTaskInitData
, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
m_sqliteMng.CreateDB(m_strDBFolder + this.toolStripTextBox1.Text + ".db");
上面这句是创建数据库;
m_sqliteMng.ExecuteSql(m_strCreatTable, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
上面这句是在数据库中创建数据库表;
m_sqliteMng.ExecuteSql(strInsertTaskInitData, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
上面这句是在数据库表中插入一条默认数据;
其中Cls_SqliteMng是封装的一个Sqlite操作类,代码如下:
 class Cls_SqliteMng
{
//string m_DBName = "";
//string connStr = ""; //创建一个数据库文件,保存在当前目录下HyData文件夹下
//
public void CreateDB(string dbName)
{
// string databaseFileName = System.Environment.CurrentDirectory + @"/HyData/" + dbName;
SQLiteConnection.CreateFile(dbName);
} //执行Sql语句
//创建一个表: ExecuteSql("create table HyTest(TestID TEXT)");
//插入些数据: ExecuteSql("insert into HyTest(TestID) values('1001')");
public void ExecuteSql(string sqlStr, string strConStr)
{
//connStr = connStr1 + m_DBName + connStr; using (DbConnection conn = new SQLiteConnection(strConStr))
{
conn.Open();
DbCommand comm = conn.CreateCommand();
comm.CommandText = sqlStr;
comm.CommandType = CommandType.Text;
comm.ExecuteNonQuery();
}
}
}

对比上一节,另一个修改的地方是,在底层采集器获取到一篇博文回调界面的AddBlog(BlogGather.DelegatePara dp)函数:

  private void AddBlog(BlogGather.DelegatePara dp)
{
if (this.InvokeRequired)
{
this.Invoke(new BlogGatherCnblogs.GreetingDelegate(this.AddBlog), dp);
return;
} try
{
string strWholeDbName = m_strDBConStringPath + this.toolStripTextBox1.Text + ".db"; DYH_DB.Model.AU_LayerNode modelAU_LayerNode = new DYH_DB.Model.AU_LayerNode();
modelAU_LayerNode.AU_ParentLayerNodeID = -;
modelAU_LayerNode.AU_LayerNodeID = m_bllAU_LayerNode.GetMaxId(strWholeDbName);
modelAU_LayerNode.AU_UrlLayer = ;
modelAU_LayerNode.AU_UrlAddress = "";
string strTitle = Regex.Replace(dp.strTitle, @"[|/\;.':*?<>-]", "").ToString();
strTitle = Regex.Replace(strTitle, "[\"]", "").ToString();
strTitle = Regex.Replace(strTitle, @"\s", "");
modelAU_LayerNode.AU_UrlTitle = strTitle;
modelAU_LayerNode.AU_UrlContent = dp.strContent; ;
modelAU_LayerNode.AU_IsVisit = ;
modelAU_LayerNode.AU_RemoveSameOffset1 = ;
modelAU_LayerNode.AU_RemoveSameOffset2 = ;
modelAU_LayerNode.AU_LastUpdateDate = System.DateTime.Now.Date; m_bllAU_LayerNode.Add(strWholeDbName, modelAU_LayerNode); DataSet dsTemps = m_bllAU_LayerNode.GetList(strWholeDbName, ""); this.dataGridView1.DataSource = dsTemps.Tables[];
this.dataGridView1.Columns[].Visible = false;
this.dataGridView1.Columns[].Width = this.Width;
}
catch (Exception ex)
{
}
}

这里,我们将采集到的博文保存到数据库中,其中用到了动软代码生成器的三层结构,具体代码请自行下载研究。

作者:宋波
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)的更多相关文章

  1. 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  2. 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  3. 网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第四篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  4. 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  5. 网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第二篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  6. 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)

    我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...

  7. 【matlab系列汇总】小白博主的matlab学习实战快速进阶之路(持续更新)

    我把之前在学习和工作中使用matlab的技巧和使用教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: MATLAB可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程 ...

  8. 【Linux系列汇总】小白博主的嵌入式Linux实战快速进阶之路(持续更新)

    我把之前在学习嵌入式Linux和工作中遇到问题和相关经验等,一起整理到这里,方便自己查阅和学习,温故而知新,如果能帮助到您,请帮忙点个赞: 本文的宗旨 嵌入式Linux 的项目通常需要一个团队来开发, ...

  9. WorldWind源码剖析系列:网络下载类WebDownload

    网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...

随机推荐

  1. [51nod] 1305 Pairwise Sum and Divide 数学

    有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:   fun(A)     sum = 0     for i = 1 to A.length         for j = ...

  2. IDEA的常用快捷键

    --------------在日常写代码的过程中自行整理出来----------------- *Alt+Enter 导入包 Ctrl+Alt+L 自动格式化代码 *Alt+Enter 自我修复 Sh ...

  3. 【sgu390】数位dp

    这题其实就是不断地合并子树,跟前面例一的思想是一样的. 这个打法我觉得非常优美啊(学别人的),为什么要搞lim1和lim2呢? 是因为在区间lim1~lim2之外的都是没有用的,但是我们f[h][su ...

  4. 【BZOJ2663】灵魂宝石 [二分]

    灵魂宝石 Time Limit: 5 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description “作为你们本体的灵魂,为了能够更好的 ...

  5. 【洛谷 P4289】[HAOI2008]移动玩具(搜索)

    其实这题可以不用状压.. 提供一种新思路. 我们在读入目标棋盘的时候,把当前位置的数和当前棋盘进行比较,如果不一样,如果当前是\(1\),目标是\(0\),那么我们就把当前位置加入\(needmove ...

  6. NYOJ 127 星际之门(一) (数学)

    题目链接 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的 ...

  7. [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca

    Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...

  8. [转]树莓派gpio口控制

    0.前言     树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [[开发语言]——python [[ ...

  9. (转)linux samb服务器配置

    1. 首先安装samba服务. 2. 配置防火墙(要先关闭) 3. 创建samba服务器用户:smbpasswd -a username     删除samba服务器用户:smbpasswd -x u ...

  10. [Leetcode Week11]Kth Largest Element in an Array

    Kth Largest Element in an Array 题解 题目来源:https://leetcode.com/problems/kth-largest-element-in-an-arra ...