文章出處

用SQLSERVER里的bcp命令或者bulkinsert命令也可以把dat文件導入數據表

下面的內容的實驗環境我是在SQLSERVER2005上面做的

之前在園子里看到兩篇文章
《C# 讀取純真IP數據庫QQWry.dat獲取地區信息》

《C#如何讀取QQ純真IP數據庫》

里面寫了很多C#代碼來讀取純真ip數據庫里的數據,純真ip地址數據庫實際上就一個dat文件,用到的代碼有多復雜,進制轉換,什么塊操作,移位

萬一數據庫改變了,這些代碼就不能用了

我發現QQ也是使用這個ip地址數據庫的,所以QQ也是經常不斷更新升級,替換這個dat文件,才能準確顯示出你的登錄地址

純真ip地址數據庫:qqwry.dat

純真ip地址數據庫下載:http://www.kuaipan.cn/file/id_4401224786921564.htm

 1 ///<summary>
 2 /// 將索引區字節塊中的起始IP轉換成Long數組
 3 ///</summary>
 4 ///<param name="ipBlock"></param>
 5 long[] BlockToArray(byte[] ipBlock)
 6 {
 7     long[] ipArray = new long[ipBlock.Length / 7];
 8     int ipIndex = 0;
 9     byte[] temp = new byte[8];
10     for (int i = 0; i < ipBlock.Length; i += 7)
11     {
12         Array.Copy(ipBlock, i, temp, 0, 4);
13         ipArray[ipIndex] = BitConverter.ToInt64(temp, 0);
14         ipIndex++;
15     }
16     return ipArray;
17 }

今天看書,看到原來實際上dat文件里只是存儲了一張表的信息,像ip地址庫就可以用一張表來存儲

這些dat文件是怎麼產生的呢?原來是從數據庫里產生的

比如:我導出pratice數據庫里的test表的數據,使用bcp命令導出,導出excel,dat文件只能使用bcp命令

1 EXEC master..xp_cmdshell 'bcp pratice.dbo.test out c:\abc.dat -T -c '

 

清空表數據

1 --清空表數據
2 USE [pratice]
3 GO
4 TRUNCATE TABLE [dbo].[test]
5 
6 SELECT * FROM [dbo].[test]

將dat文件數據導入到表里可以使用bulkinsertbcp 這兩個命令

1 BULK INSERT [pratice].[dbo].[test] FROM 'c:\abc.dat'
2 --WITH datafiletype ='char',FIELDTERMINATOR ='\t',KEEPNULLS 
3 
4 EXEC master..xp_cmdshell 'bcp pratice.dbo.test in c:\abc.dat -T -c '

---------------------------------------------華麗的分割線------------------------------------------------------------------

就像純真IP地址庫這些dat文件,一般都是把數據存儲在數據庫里,然后導出dat文件,讓應用程序來讀取dat文件,這樣就不需要安裝數據庫軟件

但是,比如在SQL2005導出的dat文件或者SQL2008導出的dat文件,不知道導出的格式有沒有區別,同樣的讀取代碼能不能用

從MYSQL導出的dat文件或從MSSQL導出的dat文件是不是一樣,是不是 用同樣的代碼就可以讀取到(我不知道MYSQL是否可以導出DAT文件)

 

----------------------------------------------總結---------------------------------------------------------------------

其實如果知道純真IP地址數據庫的表結構,那么在數據庫里新建一張表,然后把dat文件里的數據用bcp或者bulkinsert命令導入數據庫里就可以了

根本不用寫C#代碼,關鍵是表結構沒有人知道,只有作者知道,這些C#代碼還原出來的表結構也不知道是不是就是原來的那張表ip地址數據庫

的表的結構以前一直很好奇,這些dat文件怎麼存儲信息的?怎麼生成的?

今天看書以后才發現,原來這些數據都是從數據庫生成的o(∩_∩)o

 

我在想怎麼作者不把數據導出為excel 、access、txt等格式,可能數據庫支持的office版本比較低吧,連SQL2008都只支持office2003,

到SQL2012才支持office2007,office里的excel2003行數據只支持66536行,所以導出dat文件沒有這些限制,比較方便

2013-7-1補充:

使用下面的SQL語句導出dat文件后

 

1 EXEC master..xp_cmdshell 'bcp pratice.dbo.test out c:\abc.dat -T -c '

 

可以用下面C#代碼讀取dat文件里的數據,如果是寫入的話,那么就會把dat文件里的數據先清空,然后把內容寫入到dat文件里

但是我在讀取qqwry.dat 純真ip地址庫的時候卻讀取不出來,在網上查了 ,有人說是因為導出dat文件的時候使用了某一種格式

所以讀取不了,據我所知,使用SQLSERVER2005導出dat文件,是沒有任何格式參數可以選擇的,估計純真ip地址庫的dat文件

是使用非SQLSERVER數據庫來導出的

上C#代碼 嘻嘻(*^__^*)  ,代碼非常簡單

 1 using System;
 2 using System.IO;
 3 using System.Windows.Forms;
 4 
 5 namespace dat文件讀取測試
 6 {
 7     public partial class Form4 : Form
 8     {
 9         public Form4()
10         {
11             InitializeComponent();
12         }
13 
14         /// <summary>
15         /// 
16         /// </summary>
17         /// <param name="sender"></param>
18         /// <param name="e"></param>
19         private void button1_Click(object sender, EventArgs e)
20         {
21             var t1 = new StreamReader(@"C:\qqwry.dat");
22             textBox1.Text = t1.ReadToEnd().Trim();
23             t1.Close();
24 
25 
26 
27         }
28 
29         /// <summary>
30         ///31         /// </summary>
32         /// <param name="sender"></param>
33         /// <param name="e"></param>
34         private void button2_Click(object sender, EventArgs e)
35         {
36             File.WriteAllText(@"C:\abc.dat", textBox2.Text);
37         }
38     }
39 }
View Code

界面是這樣的,自己拖個按鈕和textbox就可以了

如果讀取的是qqwry.dat文件就會顯示下面的內容

讀取abc.dat文件,就可以讀出數據

反正代碼很簡單,大家可以動手實驗一下o(∩_∩)o

 

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()