一 本系列随笔目录及本节代码下载html
本身开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写做和阅读爱好者的喜好。同时也不乏一些技术爱好者咨询我,这个软件里面各类实用的功能是如何实现的。git
该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。github
本系列文章除了讲解网络采编发用到的各类重要技术以外,也提供了很多问题的解决思路和界面开发的编程经验,很是适合.NET开发的初级,中级读者,但愿你们多多支持。sql
不少初学者常有此类困惑,“为何我书也看了,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 = -1; modelAU_LayerNode.AU_LayerNodeID = m_bllAU_LayerNode.GetMaxId(strWholeDbName); modelAU_LayerNode.AU_UrlLayer = 0; 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 = 0; modelAU_LayerNode.AU_RemoveSameOffset1 = 0; modelAU_LayerNode.AU_RemoveSameOffset2 = 0; 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[0]; this.dataGridView1.Columns[1].Visible = false; this.dataGridView1.Columns[0].Width = this.Width; } catch (Exception ex) { } }
这里,咱们将采集到的博文保存到数据库中,其中用到了动软代码生成器的三层结构,具体代码请自行下载研究。