用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

 ///<summary>
/// 将索引区字节块中的起始IP转换成Long数组
///</summary>
///<param name="ipBlock"></param>
long[] BlockToArray(byte[] ipBlock)
{
long[] ipArray = new long[ipBlock.Length / ];
int ipIndex = ;
byte[] temp = new byte[];
for (int i = ; i < ipBlock.Length; i += )
{
Array.Copy(ipBlock, i, temp, , );
ipArray[ipIndex] = BitConverter.ToInt64(temp, );
ipIndex++;
}
return ipArray;
}

今天看书,看到原来实际上dat文件里只是存储了一张表的信息,像ip地址库就可以用一张表来存储

这些dat文件是怎麽产生的呢?原来是从数据库里产生的

比如:我导出pratice数据库里的test表的数据,使用bcp命令导出,导出excel,dat文件只能使用bcp命令

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

清空表数据

 --清空表数据
USE [pratice]
GO
TRUNCATE TABLE [dbo].[test] SELECT * FROM [dbo].[test]

将dat文件数据导入到表里可以使用bulkinsertbcp 这两个命令

 BULK INSERT [pratice].[dbo].[test] FROM 'c:\abc.dat'
--WITH datafiletype ='char',FIELDTERMINATOR ='\t',KEEPNULLS 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文件后

 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#代码 嘻嘻(*^__^*)  ,代码非常简单

 using System;
using System.IO;
using System.Windows.Forms; namespace dat文件读取测试
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
} /// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
var t1 = new StreamReader(@"C:\qqwry.dat");
textBox1.Text = t1.ReadToEnd().Trim();
t1.Close(); } /// <summary>
/// 写
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
File.WriteAllText(@"C:\abc.dat", textBox2.Text);
}
}
}

界面是这样的,自己拖个按钮和textbox就可以了

如果读取的是qqwry.dat文件就会显示下面的内容

读取abc.dat文件,就可以读出数据

反正代码很简单,大家可以动手实验一下o(∩_∩)o

用SQLSERVER里的bcp命令或者bulkinsert命令也可以把dat文件导入数据表的更多相关文章

  1. GreenPlum/postgres copy命令导出/导入数据

    一.COPY命令简单实用 1.copy在postgres与GreenPlum介绍 1.1 postgrespostgres的COPY命令可以快速的导出/导入数据到postgresql数据库中,支持常用 ...

  2. supercool.sh文件里,有哪些恶意的命令

    当你在一个bash命令行中输入"*"时,bash会扩展到当前目录的所有文件,然后将他们全部作为参数传递给程序.例如:rm *,将会删除掉当前目录的所有文件. 0x01 文件名被当做 ...

  3. SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?

    SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? 今天遇到某人在我以前写的一篇文章里问到 如果统计信息没来得及更新的话,那岂不是统计出来的数据时错误的 ...

  4. SQLSERVER 里经常看到的CACHE STORES是神马东东?

    SQLSERVER 里经常看到的CACHE STORES是神马东东? 当我们在SSMS里执行下面的SQL语句清空SQLSERVER的缓存的时候,我们会在SQL ERRORLOG里看到一些信息 DBCC ...

  5. linux里install命令和cp命令的区别

    转:http://blog.yikuyiku.com/?p=2659 基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务——拷贝文件,它们之间的区别主要如下: ...

  6. SqlServer 监控发布中未分发的命令数

    原文:SqlServer 监控发布中未分发的命令数 对于查看未分发的命令数,我们通常这样查看. 然而当服务器有很多发布时,一个个打开查看就很麻烦 当然,如果想用脚本查看就更方便了,运行下面的语句 -- ...

  7. 数据仓库之抽取数据:通过bcp命令行导入数据

    原文:数据仓库之抽取数据:通过bcp命令行导入数据 在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区中的数据进行转换,最后 ...

  8. 命令行工具命令 - run包到手机里

    命令行工具命令 你完全可以选择不输入以下这些命令,执行这些命令的结果与在 Android Studio 中单击"运行"按钮是一样的. chmod +x gradlew - 此命令只 ...

  9. SQLSERVER:大容量导入数据时保留标识值 (SQL Server)

    从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...

随机推荐

  1. Linux VM acquisition

    The evidence is a VM as below. The flat vmdk is the real disk, and the vmdk only 1kb is just a descr ...

  2. Unable to open file 'TYPES.OBJ'

    Unable to open file 'TYPES.OBJ' 有旧的控件HPP文件存在,旧控件的HPP文件里是Types::TPoint: 新的Berlin的是System::Types::TPoi ...

  3. MySQL日期数据类型、时间类型使用总结

    MySQL日期数据类型.时间类型使用总结 MySQL日期数据类型.MySQL时间类型使用总结,需要的朋友可以参考下.   MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型    ...

  4. [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法

    本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...

  5. sublimetext

    下载地址:http://www.sublimetext.com/ 详情:http://baike.baidu.com/link?url=uoObJWXyy_-zu52HuOKzfKuwHEpL2JQn ...

  6. centos 下添加epel源

    来源于http://www.centoscn.com/CentOS/config/2014/0920/3793.html,收录备用 0.安装yum优先级插件 yum install yum-prior ...

  7. OneNote的配置

    -------siwuxie095 1.点击 "文件" 2.点击 "发送"->"发送至博客" 3.配置博客园的连接 (1)选择博客提供 ...

  8. Android广播错误.MainActivity$MyReceiver; no empty constructor

    广播的定义,如果是内部类,必须为静态类. 下面总结一下作为内部类的广播接收者在注册的时候需要注意的地方:   1.清单文件注册广播接收者时,广播接收者的名字格式需要注意.因为是内部类,所以需要在内部类 ...

  9. HDU 4578 Transformation (线段树区间多种更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...

  10. 浅析Java内存模型

    概述 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量是线程共享的,存在竞争问题的. Java内存模型规定了所有的变量 ...