预览模式: 普通 | 列表

Mysql之mysqldump工具

一、mysqldump工具简介
  mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令Create TABLE Insert等。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。
 
二、使用示例
当前数据库清单如下:
 
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
| test2 |
| test3 |
±-------------------+
7 rows in set (0.00 sec)
 
1、备份实例下的所有库
使用–all-databases 或 -A 导出全部数据库
 
[root@test2 backuptest]# mysqldump -uroot -p -A > all.sql
Enter password:
[root@test2 backuptest]# ll -h
total 875M
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
[root@test2 backuptest]# cat all.sql |grep “Current Database:”
– Current Database: mysql
– Current Database: test1
– Current Database: test2
– Current Database: test3
 
2、导出单个指定数据库
[root@test2 backuptest]# mysqldump -uroot -p test1 > test1.sql
Enter password:
[root@test2 backuptest]# ll -h
total 875M
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
 
3、导出多个数据库
使用 --databases参数同时导出多个数据库
 
[root@test2 backuptest]# mysqldump -uroot -p --databases test1 test2 > 2.sql
Enter password:
[root@test2 backuptest]# ll -h
total 1003M
-rw-r–r-- 1 root root 99M Feb 9 11:30 2.sql
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
[root@test2 backuptest]# cat 2.sql |grep “Current Database:”
– Current Database: test1
– Current Database: test2
 
4、导出单张表
[root@test2 backuptest]# mysqldump -uroot -p mysql user > mysql.user.sql;
Enter password:
[root@test2 backuptest]# ll -h
total 1003M
-rw-r–r-- 1 root root 99M Feb 9 11:30 2.sql
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 5.6K Feb 9 11:32 mysql.user.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
 
5、导出多张表
[root@test2 backuptest]# mysqldump -uroot -p mysql user db > t2.sql;
Enter password:
[root@test2 backuptest]# ll -h
total 1003M
-rw-r–r-- 1 root root 99M Feb 9 11:30 2.sql
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 5.6K Feb 9 11:32 mysql.user.sql
-rw-r–r-- 1 root root 7.9K Feb 9 11:33 t2.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
 
6、导出匹配行
使用–where参数导出匹配行,条件内容必须加引号,如果导出数据需要导入其他的表,建议加上–skip-add-drop-table参数,因为mysqldump默认导出时添加drop table语句。
 
[root@test2 backuptest]# mysqldump -uroot -p --databases mysql --tables user --where=“user=‘root’” --skip-add-drop-table > user.root.sql
Enter password:
[root@test2 backuptest]# ll -h
total 974M
-rw-r–r-- 1 root root 99M Feb 9 11:30 2.sql
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 5.6K Feb 9 11:32 mysql.user.sql
-rw-r–r-- 1 root root 7.9K Feb 9 11:33 t2.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
-rw-r–r-- 1 root root 5.0K Feb 9 11:42 user.root.sql
 
7、只导出表结构
使用-d 或 --no-data 参数导出数据库表结构
 
[root@test2 backuptest]# mysqldump -uroot -p --all-databases --no-data > all.d.sql
Enter password:
[root@test2 backuptest]# ll -h
total 974M
-rw-r–r-- 1 root root 99M Feb 9 11:30 2.sql
-rw-r–r-- 1 root root 131K Feb 9 13:43 all.d.sql
-rw-r–r-- 1 root root 875M Feb 9 11:06 all.sql
-rw-r–r-- 1 root root 5.6K Feb 9 11:32 mysql.user.sql
-rw-r–r-- 1 root root 7.9K Feb 9 11:33 t2.sql
-rw-r–r-- 1 root root 425K Feb 9 11:29 test1.sql
-rw-r–r-- 1 root root 5.0K Feb 9 11:42 user.root.sql
 
8、带库名导出
使用-B参数带创建库语句的备份文件
 
[root@test2 backuptest]# mysqldump -uroot -p -B test1 > test1.name.sql
Enter password:
[root@test2 backuptest]# cat test1.name.sql |grep “Create DATABASE”
Create DATABASE /!32312 IF NOT EXISTS/ test1 /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
 
9、跨服务器导出
[root@test1 backuptest]# mysqldump -uroot -p -h 192.168.0.125 test1 > s125.test1.sql
Enter password:
[root@test1 backuptest]# ll -h
total 428K
-rw-r–r--. 1 root root 425K Feb 9 13:46 s125.test1.sql
 
10、跨服务器导出时启用压缩传递所有信息
[root@test1 backuptest]# mysqldump -uroot -p -h 192.168.0.125 -C test2 > s125.test2.sql
Enter password:
[root@test1 backuptest]# ll -h
total 99M
-rw-r–r--. 1 root root 425K Feb 9 13:46 s125.test1.sql
-rw-r–r--. 1 root root 98M Feb 9 13:49 s125.test2.sql
 
三、使用样式及参数说明
1、语法样式
用法: mysqldump [OPTIONS] database [tables]
或 mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…]
或 mysqldump [OPTIONS] --all-databases [OPTIONS]
 
2、参数详解
–print-defaults
-打印默认值打印程序参数列表并退出。
–no-defaults
无默认值不从任何选项文件中读取默认选项,
除了登录文件。
–defaults file=#
仅从给定文件#读取默认选项。
–defaults-extra-file=#
读取全局文件后读取此文件。
–defaults-group-suffix=#
同时读取带有concat(group,后缀)的组
–login-path=#
从登录文件中读取此路径。
–all-databases , -A
导出全部数据库。
mysqldump -uroot -p --all-databases
–all-tablespaces , -Y
导出全部表空间。
mysqldump -uroot -p --all-databases --all-tablespaces
–no-tablespaces , -y
不导出任何表空间信息。
mysqldump -uroot -p --all-databases --no-tablespaces
–add-drop-database
每个数据库创建之前添加drop数据库语句。
mysqldump -uroot -p --all-databases --add-drop-database
–add-drop-table
每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用–skip-add-drop-table取消选项)
mysqldump -uroot -p --all-databases (默认添加drop语句)
mysqldump -uroot -p --all-databases –skip-add-drop-table (取消drop语句)
–add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用–skip-add-locks取消选项)
mysqldump -uroot -p --all-databases (默认添加LOCK语句)
mysqldump -uroot -p --all-databases –skip-add-locks (取消LOCK语句)
–allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。
mysqldump -uroot -p --all-databases --allow-keywords
–apply-slave-statements
在’CHANGE MASTER’前添加’STOP SLAVE’,并且在导出的最后添加’START SLAVE’。
mysqldump -uroot -p --all-databases --apply-slave-statements
–character-sets-dir
字符集文件的目录
mysqldump -uroot -p --all-databases --character-sets-dir=/usr/local/mysql/share/mysql/charsets
–comments
附加注释信息。默认为打开,可以用–skip-comments取消
mysqldump -uroot -p --all-databases (默认记录注释)
mysqldump -uroot -p --all-databases --skip-comments (取消注释)
–compatible
导出的数据将和其它数据库或旧版本的MySQL 相兼容。值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,
要使用几个值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。
mysqldump -uroot -p --all-databases --compatible=ansi
–compact
导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:–skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys
mysqldump -uroot -p --all-databases --compact
–complete-insert, -c
使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。
mysqldump -uroot -p --all-databases --complete-insert
–compress, -C
在客户端和服务器之间启用压缩传递所有信息
mysqldump -uroot -p --all-databases --compress
–create-options, -a
在Create TABLE语句中包括所有MySQL特性选项。(默认为打开状态)
mysqldump -uroot -p --all-databases
–databases, -B
导出几个数据库。参数后面所有名字参量都被看作数据库名。
mysqldump -uroot -p --databases test mysql
–debug
输出debug信息,用于调试。默认值为:d:t:o,/tmp/mysqldump.trace
mysqldump -uroot -p --all-databases --debug
mysqldump -uroot -p --all-databases --debug=” d:t:o,/tmp/debug.trace”
–debug-check
检查内存和打开文件使用说明并退出。
mysqldump -uroot -p --all-databases --debug-check
–debug-info
输出调试信息并退出
mysqldump -uroot -p --all-databases --debug-info
–default-character-set
设置默认字符集,默认值为utf8
mysqldump -uroot -p --all-databases --default-character-set=latin1
–delayed-insert
采用延时插入方式(Insert DELAYED)导出数据
mysqldump -uroot -p --all-databases --delayed-insert
–delete-master-logs
master备份后删除日志. 这个参数将自动激活–master-data。
mysqldump -uroot -p --all-databases --delete-master-logs
–disable-keys
对于每个表,用/*!40000 Alter TABLE tbl_name DISABLE KEYS /;和/!40000 Alter TABLE tbl_name ENABLE KEYS */;语句引用Insert语句。这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。该选项只适合MyISAM表,默认为打开状态。
mysqldump -uroot -p --all-databases
–dump-slave
该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开–lock-all-tables,除非–single-transaction被指定。该选项会自动关闭–lock-tables选项。默认值为0。
mysqldump -uroot -p --all-databases --dump-slave=1
mysqldump -uroot -p --all-databases --dump-slave=2
–events, -E
导出事件。
mysqldump -uroot -p --all-databases --events
–extended-insert, -e
使用具有多个VALUES列的Insert语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用–skip-extended-insert取消选项。
mysqldump -uroot -p --all-databases
mysqldump -uroot -p --all-databases–skip-extended-insert (取消选项)
–fields-terminated-by
导出文件中忽略给定字段。与–tab选项一起使用,不能用于–databases和–all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=”#”
–fields-enclosed-by
输出文件中的各个字段用给定字符包裹。与–tab选项一起使用,不能用于–databases和–all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#”
–fields-optionally-enclosed-by
输出文件中的各个字段用给定字符选择性包裹。与–tab选项一起使用,不能用于–databases和–all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#” --fields-optionally-enclosed-by =”#”
–fields-escaped-by
输出文件中的各个字段忽略给定字符。与–tab选项一起使用,不能用于–databases和–all-databases选项
mysqldump -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=”#”
–flush-logs
开始导出之前刷新日志。
请注意:假如一次导出多个数据库(使用选项–databases或者–all-databases),将会逐个数据库刷新日志。除使用–lock-all-tables或者–master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用–lock-all-tables 或者–master-data 和–flush-logs。
mysqldump -uroot -p --all-databases --flush-logs
–flush-privileges
在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。
mysqldump -uroot -p --all-databases --flush-privileges
–force
在导出过程中忽略出现的SQL错误。
mysqldump -uroot -p --all-databases --force
–help
显示帮助信息并退出。
mysqldump --help
–hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。
mysqldump -uroot -p --all-databases --hex-blob
–host, -h
需要导出的主机信息
mysqldump -uroot -p --host=localhost --all-databases
–ignore-table
不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:–ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user
–include-master-host-port
在–dump-slave产生的’CHANGE MASTER TO…‘语句中增加’MASTER_HOST=,MASTER_PORT=’
mysqldump -uroot -p --host=localhost --all-databases --include-master-host-port
–insert-ignore
在插入行时使用Insert IGNORE语句.
mysqldump -uroot -p --host=localhost --all-databases --insert-ignore
–lines-terminated-by
输出文件的每行用给定字符串划分。与–tab选项一起使用,不能用于–databases和–all-databases选项。
mysqldump -uroot -p --host=localhost test test --tab=”/tmp/mysql” --lines-terminated-by=”##”
–lock-all-tables, -x
提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭–single-transaction 和–lock-tables 选项。
mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables
–lock-tables, -l
开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,–single-transaction是一个更好的选择,因为它根本不需要锁定表。
请注意当导出多个数据库时,–lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。
mysqldump -uroot -p --host=localhost --all-databases --lock-tables
–log-error
附加警告和错误信息到给定文件
mysqldump -uroot -p --host=localhost --all-databases --log-error=/tmp/mysqldump_error_log.err
–master-data
该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开–lock-all-tables 选项,除非–single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的–single-transaction选项)。该选项自动关闭–lock-tables选项。
mysqldump -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump -uroot -p --host=localhost --all-databases --master-data=2;
–max_allowed_packet
服务器发送和接受的最大包长度。
mysqldump -uroot -p --host=localhost --all-databases --max_allowed_packet=10240
–net_buffer_length
TCP/IP和socket连接的缓存大小。
mysqldump -uroot -p --host=localhost --all-databases --net_buffer_length=1024
–no-autocommit
使用autocommit/commit 语句包裹表。
mysqldump -uroot -p --host=localhost --all-databases --no-autocommit
–no-create-db, -n
只导出数据,而不添加Create DATABASE 语句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-db
–no-create-info, -t
只导出数据,而不添加Create TABLE 语句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-info
–no-data, -d
不导出任何数据,只导出数据库表结构。
mysqldump -uroot -p --host=localhost --all-databases --no-data
–no-set-names, -N
等同于–skip-set-charset
mysqldump -uroot -p --host=localhost --all-databases --no-set-names
–opt
等同于–add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 该选项默认开启, 可以用–skip-opt禁用.
mysqldump -uroot -p --host=localhost --all-databases --opt
–order-by-primary
如果存在主键,或者第一个唯一键,对每个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工作花费很长时间。
mysqldump -uroot -p --host=localhost --all-databases --order-by-primary
–password, -p
连接数据库密码
–pipe(windows系统可用)
使用命名管道连接mysql
mysqldump -uroot -p --host=localhost --all-databases --pipe
–port, -P
连接数据库端口号
–protocol
使用的连接协议,包括:tcp, socket, pipe, memory.
mysqldump -uroot -p --host=localhost --all-databases --protocol=tcp
–quick, -q
不缓冲查询,直接导出到标准输出。默认为打开状态,使用–skip-quick取消该选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quick
–quote-names,-Q
使用(`)引起表和列名。默认为打开状态,使用–skip-quote-names取消该选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quote-names
–replace
使用REPLACE INTO 取代Insert INTO.
mysqldump -uroot -p --host=localhost --all-databases --replace
–result-file, -r
直接输出到指定文件中。该选项应该用在使用回车换行对(\r\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。
mysqldump -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt
–routines, -R
导出存储过程以及自定义函数。
mysqldump -uroot -p --host=localhost --all-databases --routines
–set-charset
添加’SET NAMES default_character_set’到输出文件。默认为打开状态,使用–skip-set-charset关闭选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-set-charset
–single-transaction
该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和–lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用–quick 选项。
mysqldump -uroot -p --host=localhost --all-databases --single-transaction
–dump-date
将导出时间添加到输出文件中。默认为打开状态,使用–skip-dump-date关闭选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-dump-date
–skip-opt
禁用–opt选项.
mysqldump -uroot -p --host=localhost --all-databases --skip-opt
–socket,-S
指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock
mysqldump -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock
–tab,-T
为每个表在给定路径创建tab分割的文本文件。注意:仅仅用于mysqldump和mysqld服务器运行在相同机器上。
mysqldump -uroot -p --host=localhost test test --tab="/home/mysql"
–tables
覆盖–databases (-B)参数,指定需要导出的表名。
mysqldump -uroot -p --host=localhost --databases test --tables test
–triggers
导出触发器。该选项默认启用,用–skip-triggers禁用它。
mysqldump -uroot -p --host=localhost --all-databases --triggers
–tz-utc
在导出顶部设置时区TIME_ZONE=’+00:00’ ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。
mysqldump -uroot -p --host=localhost --all-databases --tz-utc
–user, -u
指定连接的用户名。
–verbose, --v
输出多种平台信息。
–version, -V
输出mysqldump版本信息并退出
–where, -w
只转储给定的Where条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。
mysqldump -uroot -p --host=localhost --all-databases --where=” user=’root’”
–xml, -X
导出XML格式.
mysqldump -uroot -p --host=localhost --all-databases --xml
–plugin_dir
客户端插件的目录,用于兼容不同的插件版本。
mysqldump -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin”
–default_auth
客户端插件默认使用权限。
mysqldump -uroot -p --host=localhost --all-databases --default-auth=”/usr/local/lib/plugin/”
 
 

Tags: mysql

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 207

几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧。
我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧。

首先,先下载 纯真数据库,名称应该是 QQWry.dat 。
之后将数据库文件复制到程序的主目录即可。

Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Net
Imports System.Net.Sockets


''' <summary>IP地址查询</summary>
Public NotInheritable Class IPQuery


    ''' <summary>IP地址描述</summary>
    Public Structure IPLocation
        Sub New(ByVal i As String, ByVal c As String, ByVal l As String)
            IP = i
            Country = c
            Local = l
        End Sub
        ''' <summary>IP地址</summary>
        Dim IP As String
        ''' <summary>地域\国家\机构</summary>
        Dim Country As String
        ''' <summary>地域描述</summary>
        Dim Local As String


        ''' <summary>返回完整名称</summary>
        Overloads Function ToString() As String
            Return Me.Country & Me.Local
        End Function
        ''' <param name="ls">连接字符</param>
        Overloads Function ToString(ByVal ls As String) As String
            Return Me.Country & ls & Me.Local
        End Function

        ' 强制转换
        Public Shared Widening Operator CType(ByVal o As IPLocation) As String
            Return o.ToString
        End Operator

    End Structure


    Shared encoding As Encoding = encoding.GetEncoding("GB2312")

    Shared ipCount As Integer
    Shared fsinoffiset As Integer
    Shared lsinoffiset As Integer
    Shared data As Byte()
    ' 加强线程访问安全
    Shared rwl As New Threading.ReaderWriterLock

    ''' <summary>刷新IP数据库</summary>
    Shared Sub ReIPData(ByVal dataPath As String)
        rwl.AcquireWriterLock(-1) '设置写权限,禁止读权限

        ' 尝试回收内存中的数据库
        If data IsNot Nothing Then
            data = Nothing
            GC.Collect()
        End If
        ' 读取数据
        data = IO.File.ReadAllBytes(dataPath)
        fsinoffiset = CInt(data(0)) + (CInt(data(1)) << 8) + (CInt(data(2)) << 16) + (CInt(data(3)) << 24)
        lsinoffiset = CInt(data(4)) + (CInt(data(5)) << 8) + (CInt(data(6)) << 16) + (CInt(data(7)) << 24)
        ipCount = (lsinoffiset - fsinoffiset) / 7 + 1

        rwl.ReleaseWriterLock()

        If ipCount <= 1 Then Throw New ApplicationException("提供的IP数据错误!")
    End Sub

    Shared Sub New()
        ' TODO 替换为自己的数据库地址
        ReIPData(Application.StartupPath & "\QQWry.dat")
    End Sub

    ''' <summary>返回数据库中IP纪录总数</summary>
    Shared ReadOnly Property Count() As Integer
        Get
            Return ipCount
        End Get
    End Property

    ''' <summary>查询一组IP地址</summary>
    Shared Function QueryAll(ByVal ParamArray ips As String()) As IPLocation()
        If ips Is Nothing orElse ips.Length = 0 Then Return Nothing

        Dim ipls(ips.Length - 1) As IPLocation
        For i As Integer = 0 To ips.Length - 1
            ipls(i) = Query(ips(i))
        Next
        Return ipls
    End Function

    ''' <summary>查询IP地址</summary>
    Shared Function Query(ByVal ip As String) As IPLocation

        rwl.AcquireReaderLock(-1) '设置读权限

        Dim ads As IPAddress = IPAddress.Parse(ip)
        If ads.AddressFamily <> AddressFamily.InterNetwork Then Throw New ArgumentException("不支持非IPV4协议")
        If IPAddress.IsLoopback(ads) Then
            rwl.ReleaseReaderLock()
            Return New IPLocation(ip, "本机或保留地址", "")
        End If

        'Dim intIp As UInteger = CUInt(IPAddress.HostToNetworkOrder(CInt(ads.Address)))
        Dim intIp As UInteger = m_ip2uint(ads.ToString)

        Dim iplon As IPLocation : iplon.IP = ip

        Dim right As UInteger = ipCount
        Dim left, middle, startIp, endIpOff, endIp As UInteger
        Dim countryFlag As Integer = 0

        While left < (right - 1)
            middle = (right + left) / 2
            startIp = GetStartIp(middle, endIpOff)
            If intIp = startIp Then
                left = middle
                Exit While
            End If
            If intIp > startIp Then
                left = middle
            Else
                right = middle
            End If
        End While

        startIp = GetStartIp(left, endIpOff)
        endIp = GetEndIp(endIpOff, countryFlag)
        If startIp <= intIp And endIp >= intIp Then
            Dim local As String = ""
            iplon.Country = GetCountry(endIpOff, countryFlag, local)
            If local = " CZ88.NET" Then local = "" '优化 用于去除部分IP地址返回的广告数据
            iplon.Local = local
        Else
            iplon.Country = "未知地区"
            iplon.Local = "" '"火星网友"
        End If

        rwl.ReleaseReaderLock()

        Return iplon
    End Function

    Private Shared Function GetStartIp(ByVal left As UInteger, ByRef endIpOff As UInteger) As UInteger
        Dim leftOffset As Integer = CInt(fsinoffiset + (left * 7))
        endIpOff = CUInt(data(leftOffset + 4)) + (CUInt(data(leftOffset + 5)) << 8) + (CUInt(data(leftOffset + 6)) << 16)
        Return CUInt(data(leftOffset)) + (CUInt(data(leftOffset + 1)) << 8) + (CUInt(data(leftOffset + 2)) << 16) + (CUInt(data(leftOffset + 3)) << 24)
    End Function
    Private Shared Function GetEndIp(ByVal endIpOff As UInteger, ByRef countryFlag As Integer) As UInteger
        countryFlag = data(endIpOff + 4)
        Return CUInt(data(endIpOff)) + (CUInt(data(endIpOff + 1)) << 8) + (CUInt(data(endIpOff + 2)) << 16) + (CUInt(data(endIpOff + 3)) << 24)
    End Function

    Private Shared Function GetCountry(ByVal endIpOff As UInteger, ByVal countryFlag As Integer, ByRef local As String) As String
        Dim country As String = ""
        Dim offset As UInteger = endIpOff + 4
        Select Case countryFlag
            Case 1, 2
                country = GetFlagStr(offset, countryFlag, endIpOff)
                offset = endIpOff + 8
                local = IIf(countryFlag = 1, "", GetFlagStr(offset, countryFlag, endIpOff))
            Case Else
                country = GetFlagStr(offset, countryFlag, endIpOff)
                local = GetFlagStr(offset, countryFlag, endIpOff)
        End Select
        Return country
    End Function

    Private Shared Function GetFlagStr(ByRef offset As UInteger, ByRef countryFlag As Integer, ByRef endIpOff As UInteger) As String
        Dim flag As Integer = 0
        Do

            flag = data(offset)
            If flag <> 1 And flag <> 2 Then Exit Do
            If flag = 2 Then
                countryFlag = 2
                endIpOff = offset - 4
            End If
            offset = CUInt(data(offset + 1)) + (CUInt(data(offset + 2)) << 8) + (CUInt(data(offset + 3)) << 16)
        Loop
        If offset < 12 Then Return ""
        Return GetStr(offset)
    End Function

    Private Shared Function GetStr(ByRef offset As UInteger) As String
        Dim lowByte As Byte = 0, highByte As Byte = 0
        Dim sb As New StringBuilder(16)
        Do
            lowByte = data(offset) : offset += 1
            If lowByte = 0 Then Return sb.ToString
            If lowByte > &H7F Then
                highByte = data(offset) : offset += 1
                If highByte = 0 Then Return sb.ToString
                sb.Append(encoding.GetString(New Byte() {lowByte, highByte}))
            Else
                sb.Append(ChrW(lowByte))
            End If
        Loop
    End Function

    ''' <summary>将ip地址转换为uint</summary>
    Private Shared Function m_ip2uint(ByVal ip As String) As UInteger
        Dim bs As Byte() = IPAddress.Parse(ip).GetAddressBytes
        Return CUInt(bs(3)) + (CUInt(bs(2)) << 8) + (CUInt(bs(1)) << 16) + (CUInt(bs(0)) << 24)
    End Function

End Class

 如果你要设置自定义的数据库位置,记得修改 Shared Sub New 这个方法,或者干脆删除它,自己调用 ReIPData 来设置数据库的地址。

 

查看更多...

Tags: vb.net

分类:Asp.NET | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 196

VB.NET URL(域名)转IP地址

什么是“URL”?

我在脑中快速回忆着,对了!URL即 Uniform Resource Locator的缩写,翻译成中文便是“统一资源定位符”。因为互联网世界存在着不计其数的资源,每一处资源都需要有一个标记来定位它,正如人类城市中的门牌号。

什么是IP?

IP即Internet Protocol的缩写,中文译为“互联网协议”,一个如雷贯耳的名字,互联网的基石之一,一切依赖互联网通信的软件都得遵循这个协议。

好了!既然了解了它们是什么.那么我们就直接上代码吧!

查看更多...

Tags: vb.net

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 206

vb.net的正则表达式

正则表达式的作用是从一个字符串中捕获符合要求的字符串。

使用正则表达式需使用一下语句:
Import System.Globalization
Import System.IO
Import System.Text
Import.System.Text.RegularExpressions
先看一个最简单的捕获:
正则表达式 /123/ 捕获任意字符串中的 ”123” 。如:
“a123b”
“aaab12bb13123c”
匹配:
如果一个字符串中存在至少一个捕获,就算这个正则表达式匹配此字符串。如果只存在一个捕获,而且此捕获是整个字符串,则算完全匹配。
“或”符号(“|”):
正则表达式 /123|a/ 捕获 ”123” 或者 ”12a”,如:
“12ac123”
“12abcc”
“01262312343”
并:
任何两个正则表达式放在一起就成了并,如 /a/ 是一个合法的正则表达式,它捕获 ”a” 字符, /b/ 也是一个合法的正则表达式,它捕获 ”b” 字符。/ab/ 这个正则表达式捕获连在一起的 ”ab” 这样的字符串。在并的时候,两个正则表达式之间形成了断言。(关于断言会在下面讲到)。
括号:
可以用括号可以者强调符号的结合顺序,如正则表达式/(123)|(abc)/”捕获”123”或者”abc”
字符类:
可以用 [abc] 的形式来表示 (a|b|c) ,如:
正则表达式 /[abc]/ 捕获 ”a” 、”b” 或者 ”c”。
字符类的特殊构造:
“^” 放在 [] 的开头表示不捕获这些字符,如:
正则表达式 /[^abc]/ 捕获除了 ”a” 、 ”b” 和 ”c” 以外的任何字符。
“-“ 放在两个字符之间,表示匹配在字符表上这两个字符之间的所有字符。如:
[a-z] = [abcdefghijklmnopqrstuvwxyz]
[a-Z] = [a-zA-Z] = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]
[0-9] = [0123456789]
特殊的字符类:
\w = [a-zA-Z_0-9]
\W = [^\w]
\s = [ \f\n\r\t\v](注1)
\S = [^\s]
\d = [0-9]
\D = [^\d]
. = 任何字符(如果没有加SingleLine参数则不匹配”\n”)
注1:\f\n\r\t\v与C语言转义字符串含义相同。如(\n换行符, \t跳格符)
重复:
正则表达式 /a{1,3}/表示/(a)|(aa)|(aaa)/,捕获”a”、”aa”或者”aaa”。
另有特殊字符约定如下:
* = {0,无穷大}
+ = {1,无穷大}
? = {0,1}
重复可以与括号一起用,如:
正则表达式 /(abc){1,2}/捕获”abc”或者”abcabc”。
零重复的作用:
零重复代表不捕获任何字符。单独使用无意义,但可以组合。如:
正则表达式/abc?/捕获”ab”或者”abc”。
以上所有的不包含无穷大重复的正则表达式都可以转化为只包含,或、并和括号的正则表达式。
(如数学中的3x5 = 1x5+2x5 ^_^)
如正则表达式:/([abc]1){2,3}/ = /(((a|b|c)1)((a|b|c)1))|(((a|b|c)1)((a|b|c)1)((a|b|c)1))/
断言:
任何两个合法的正则表达式并在一起的时候,在它们之间就形成断言。如正则表达式: /ab/ 是由正则表达式 /a/ 和 /b/ 并而组成的,在a和b之间就形成了断言。/ab/ 正则表达式中的 /a/ 只能捕获在字符 ”b” 前面的 ”a”,而 /b/ 也只能捕获字符 ”a” 后面的 ”b”。
零宽度(非捕获)断言符:
“$”断言此处一定是字符串的结尾,如:
正则表达式/abc$/捕获在字符串结尾处的abc,而忽略字符串中间任何的”abc”,如:
“123abcc”,无捕获,不匹配。
“$” 断言此处一定是字符串的结尾,如:
正则表达式 /abc$/捕获在字符串结尾处的abc,而忽略字符串中间任何的 ”abc”,如:
“123abcc”,无捕获,不匹配
“abcsabc”
“^”断言此处一定是字符串的开头。

Tags: vb.net

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 204

VB.Net常用的正则表达式(实例)

"^\d+$"  //非负整数(正整数 + 0)

"^[0-9]*[1-9][0-9]*$"  //正整数

"^((-\d+)|(0+))$"  //非正整数(负整数 + 0)

"^-[0-9]*[1-9][0-9]*$"  //负整数

查看更多...

Tags: vb.net 正则表达式

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 161

正则表达式之替换

正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。

字符

描述

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
  匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
/i 使正则表达式对大小写不敏感, (?-i)是关闭大小写不敏感
(?i)te(?-i)st应该匹配TEst,但是不能匹配teST或TEST.
/s 开启“单行模式”,即点号“.”匹配新行符
/m 开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。
^[0-9]*$ 只能输入数字
^\d{n}$ 只能输入n位的数字
^\d{n,}$ 只能输入至少n位的数字
^\d{m,n}$ 只能输入m~n位的数字
^(0|[1-9][0-9]*)$ 只能输入零和非零开头的数字
^[0-9]+(.[0-9]{2})?$ 只能输入有两位小数的正实数
^[0-9]+(.[0-9]{1,3})?$ 只能输入有1~3位小数的正实数
^\+?[1-9][0-9]*$ 只能输入非零的正整数
^\-[1-9][]0-9"*$ 只能输入非零的负整数
^.{3}$ 只能输入长度为3的字符
^[A-Za-z]+$ 只能输入由26个英文字母组成的字符串
^[A-Za-z0-9]+$ 只能输入由数字和26个英文字母组成的字符串
^\w+$ 只能输入由数字、26个英文字母或者下划线组成的字符串
^[a-zA-Z]\w{5,17}$ 验证用户密码:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
[^%&',;=?$\x22]+ 验证是否含有^%&',;=?$\"等字符
^[\u4e00-\u9fa5]{0,}$ 只能输入汉字
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 验证Email地址
^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 验证InternetURL
^\d{15}|\d{18}$ 验证身份证号(15位或18位数字)
^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$ 验证IP地址
(\w)\1 匹配两个两个重叠出现的字符

例如,"aabbc11asd", 返回结果为aa bb 11三组match

<(?[^\s>]+)[^>]*>.*> 匹配成对的HTML标签
(?!) 不出现,负声明
下例演示如何取得一个标签对中的全部内容,即使其中包含别的HTML tag。 

 
string newsContent = @"url:test
 
Regex."; 
Regex regEnd = new Regex(@"<\s*a[^>]*>([^<]|<(?!/a))*<\s*/a\s*>",RegexOptions.Multiline); 

 

查看更多...

Tags: 正则表达式

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 159

PHP通过Http Post请求发送Json对象数据

PHP调用第三方Java/.Net写好的 Restful Api,其中有些接口,需要在发送 POST请求时,传入对象。
 
Http中传输对象,最好的表现形式莫过于JSON字符串了,但是作为参数的接收方,又是需要被告知传过来的是JSON!
 
只要发送一个http Content-Type头信息即可,即 “Content-Type: application/json; charset=utf-8”,参考代码如下:
PHP代码
  1. /** 
  2.  * PHP发送Json对象数据 
  3.  * @param $url 请求url 
  4.  * @param $jsonStr 发送的json字符串 
  5.  * @return array 
  6.  */  
  7. function send_post_json($url$jsonStr)  
  8. {  
  9.     $ch = curl_init();  
  10.     curl_setopt($ch, CURLOPT_POST, 1);  
  11.     curl_setopt($ch, CURLOPT_URL, $url);  
  12.     curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);  
  13.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  14.     curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
  15.             'Content-Type: application/json; charset=utf-8',  
  16.             'Content-Length: ' . strlen($jsonStr)  
  17.         )  
  18.     );  
  19.     $response = curl_exec($ch);  
  20.     $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
  21.     curl_close($ch);  
  22.     return array($httpCode$response);  
  23. }  
  24.    
  25. $target = "http://texst.api.cn/api/dev/start";  
  26.    
  27. $postdata=array();  
  28. $postdata["token"]="99d710a1f7bc11eab31a00508c";  
  29. $postdata["imei"]="868739053737";  
  30. $jsonStr = json_encode($postdata);  
  31. $result = send_post_json($target,$jsonStr);  
  32. var_dump($result);  
  33.    
  34. //Json字符串转换成类对象 即可  
 

Tags: php

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 157

PHP如何接收post传递的json数据

PHP如何接收post来的json数据?

要在PHP中整体接收POST数据,有两种方法。

注意,要使用以下两种方法,Content-Type不能为multipart/form-data。

方法一:

使用:file_get_contents('php://input')

查看更多...

Tags: php

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 154

使用VB.net建立excel文件

' Add the following code snippet on top of Form1.vb
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim appXL As Excel.Application '声明一个application对象
Dim wbXl As Excel.Workbook '声明一个工作簿对象
Dim shXL As Excel.Worksheet '声明一个工作表对象
Dim raXL As Excel.Range '声明一个范围对象
' Start Excel and get Application object.
appXL = CreateObject("Excel.Application")
appXL.Visible = True
' Add a new workbook.
wbXl = appXL.Workbooks.Add
shXL = wbXl.ActiveSheet
' Add table headers going cell by cell.
shXL.Cells(1, 1).Value = "First Name"
shXL.Cells(1, 2).Value = "Last Name"
shXL.Cells(1, 3).Value = "Full Name"
shXL.Cells(1, 4).Value = "Specialization"
' Format A1:D1 as bold, vertical alignment = center.
With shXL.Range("A1", "D1")
.Font.Bold = True
.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
End With
' Create an array to set multiple values at once.
Dim students(5, 2) As String
students(0, 0) = "Zara"
students(0, 1) = "Ali"
students(1, 0) = "Nuha"
students(1, 1) = "Ali"
students(2, 0) = "Arilia"
students(2, 1) = "RamKumar"
students(3, 0) = "Rita"
students(3, 1) = "Jones"
students(4, 0) = "Umme"
students(4, 1) = "Ayman"
' Fill A2:B6 with an array of values (First and Last Names).
shXL.Range("A2", "B6").Value = students
' Fill C2:C6 with a relative formula (=A2 & " " & B2).
raXL = shXL.Range("C2", "C6")
raXL.Formula = "=A2 & "" "" & B2"
' Fill D2:D6 values.
With shXL
.Cells(2, 4).Value = "Biology"
.Cells(3, 4).Value = "Mathmematics"
.Cells(4, 4).Value = "Physics"
.Cells(5, 4).Value = "Mathmematics"
.Cells(6, 4).Value = "Arabic"
End With
' AutoFit columns A:D.
raXL = shXL.Range("A1", "D1")
raXL.EntireColumn.AutoFit()
' Make sure Excel is visible and give the user control
' of Excel's lifetime.
appXL.Visible = True
appXL.UserControl = True
' Release object references.
raXL = Nothing
shXL = Nothing
wbXl = Nothing
appXL.Quit()
appXL = Nothing
Exit Sub
Err_Handler:
MsgBox(Err.Description, vbCritical, "Error: " & Err.Number)
End Sub
End Class

Tags: vb.net

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 154

vb.net 下的 CSV文件操作

常见CSV文件的操作

Private Function ExportCsvProcess(ByVal FilePath As String ByVal, dt As DataTable) As Boolean

Dim fileStream As System.IO.FileStream
Dim streamWriter As System.IO.StreamWriter
Dim intRow, intCol As Integer
Dim strRow As String

'删除旧CSV文件
If (System.IO.File.Exists(FilePath)) Then
System.IO.File.Delete(FilePath)
End If

Try
fileStream = New FileStream(FilePath, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write)
If Not dt Is Nothing Then
streamWriter = New StreamWriter(fileStream, System.Text.Encoding.Default)
strRow = ""
'讀列名
For intCol = 0 To dt.Columns.Count - 1
strRow += dt.Columns(intCol).ColumnName
If intCol < dt.Columns.Count - 1 Then
strRow += ","
End If
Next
streamWriter.WriteLine(strRow)
'读每行的值
For intRow = 0 To dt.Rows.Count - 1
strRow = ""
For intCol = 0 To dt.Columns.Count - 1
strRow += CStr(dt.Rows(intRow).Item(intCol))
If intCol < dt.Columns.Count - 1 Then
strRow += ","
End If
Next
streamWriter.WriteLine(strRow)
Next
streamWriter.Close()
End If
Catch ex As Exception
MessageShow(ex.ToString())
Return False
Finally
fileStream.Close()
End Try
Return True

End Function

查看更多...

Tags: vb.net

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 130

 广告位

↑返回顶部↑