標籤:winform datagridview style blog http io ar color os
一 本系列隨筆目錄及本節代碼下載
開發環境:VS2008
本節源碼位置:https://github.com/songboriceboy/GatherAllStoreInDB
源碼下載辦法:安裝SVN用戶端(本文最後提供),然後checkout以下的地址:https://github.com/songboriceboy/GatherAllStoreInDB
系列文章提綱擬定如下:
1.如何使用C#語言擷取部落格園某個博主的全部隨筆連結及標題;
2.如何使用C#語言獲得博文的內容;
3.使用C#語言如何將html網頁轉換成pdf(html2pdf)
4.如何使用C#語言下載博文中的全部圖片到本地並可以離線瀏覽
5.如何使用C#語言合成多個單個的pdf檔案到一個pdf中,並組建目錄
6.網易部落格的連結如何使用C#語言擷取到,網易部落格的特殊性;
7.公眾號文章如何使用C#語言下載;
8.如何擷取任意一篇文章的全部圖文
9.如何使用C#語言去掉html中的全部標籤擷取純文字(html2txt)
10.如何使用C#語言將多個html檔案編譯成chm(html2chm)
11.如何使用C#語言遠程發布文章到新浪部落格
12.如何使用C#語言開發靜態網站產生器
13.如何使用C#語言搭建程式架構(經典Winform介面,頂部功能表列,工具列,左邊樹形列表,右邊多Tab介面)
14.如何使用C#語言實現網頁編輯器(Winform)......
二 第六節主要內容簡介(將任意博主的全部博文下載到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/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。
正在看本人部落格的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日後必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不準,你也好回來找我!
網路採集軟體核心技術剖析系列(6)---將任意博主的全部博文下載到SQLite資料庫中並通過Webbrower顯示(將之前的內容綜合到一起)