用SQLSERVER里的bcp命令或者bulkinsert命令也可以把dat文件導入數據表
下面的內容的實驗環境我是在SQLSERVER2005上面做的
之前在園子里看到兩篇文章
《C# 讀取純真IP數據庫QQWry.dat獲取地區信息》
里面寫了很多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文件數據導入到表里可以使用bulkinsert 或bcp 這兩個命令
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 }
界面是這樣的,自己拖個按鈕和textbox就可以了
如果讀取的是qqwry.dat文件就會顯示下面的內容
讀取abc.dat文件,就可以讀出數據
反正代碼很簡單,大家可以動手實驗一下o(∩_∩)o
文章列表