網絡採集軟件核心技術剖析系列(6)---將任意博主的所有博文下載到SQLite數據庫中並經過Webbrower顯示(將以前的內容綜合到一塊兒)

一 本系列隨筆目錄及本節代碼下載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)
            {
            }
        }

這裏,咱們將採集到的博文保存到數據庫中,其中用到了動軟代碼生成器的三層結構,具體代碼請自行下載研究。 

做者: 宋波
出處: http://www.cnblogs.com/ice-river/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,往後必有一番做爲!旁邊有「推薦」二字,你就順手把它點了吧,相得準,我分文不收;相不許,你也好回來找我!
相關文章
相關標籤/搜索