【转载】SqlBulkCopy.批量导入日志文件中的内容到SQL SERVER
2011-12-08 09:26
375 查看
单叙述了使用正则表达式分割Apache日志文件中每条记录的信息,现在解决如何批量导入日志文件中的内容到SQL SERVER数据库。思路如下:
1.利用SqlBulkCopy.WriteToServer(IDataReader reader)方法批量导入日志文件中的记录到SQL SERVER数据库。
2.自定义的TxtDataReader类实现IDataReader接口用于传递给SqlBulkCopy.WriteToServer使用。
3.在TxtDataReader的实现中利用正则表达式分组捕获需要的信息。
第一步:实现自定义的TxtDataReader类
1.代码中的未列出实现的IDateReader接口成员对当前实现的功能没有影响。
2.TxtDataReader构造函数的pattren参数格式必须是:命名分组_类型,类型只简单的匹配了int|date|string三种。
代码
备注:
1.如果其他场合需要以reader[int]或reader[string]形式获取读取器重的方法,需实现索引器。如需使用其他IDataReader接口定义的方法,同样。
参考代码:
2.为让示例代码简单清晰,其他未提供具体实现的IDataReader代码放在了分部类中。
3.当前所述解决的问题是解析日志文件并导入数据库中,只提供了满足当前需求的精简代码,甚至不包含必要的异常处理,数据截断、溢出等处理,如在实际用途中使用,需自行扩展和添加代码。
4.简单的、仅具参考价值的测试:windows xp\.net 2.0 \sql server 2005\2G内存 217M大小正式站日志文件,处理十次,平均时间35秒。
1.利用SqlBulkCopy.WriteToServer(IDataReader reader)方法批量导入日志文件中的记录到SQL SERVER数据库。
2.自定义的TxtDataReader类实现IDataReader接口用于传递给SqlBulkCopy.WriteToServer使用。
3.在TxtDataReader的实现中利用正则表达式分组捕获需要的信息。
第一步:实现自定义的TxtDataReader类
1.代码中的未列出实现的IDateReader接口成员对当前实现的功能没有影响。
2.TxtDataReader构造函数的pattren参数格式必须是:命名分组_类型,类型只简单的匹配了int|date|string三种。
代码
1 static void Main(string[] args) 2 { 3 string pattern = "^(?<ip_string>[0-9.]+)\\s(?<identity_string>[\\w.-]+)\\s(?<userid_string>[\\w.-]+)\\s(?<date_date>\\[[^\\[\\]]+\\])\\s\"(?<request_string>(?:[^\"]|\\\")+)\"\\s(?<status_int>\\d{3})\\s(?<bytes_int>\\d+|-)\\s\"(?<ref_string>(?:[^\"]|\\\")+)\"\\s\"(?<useragent_string>(?:[^\"]|\\\")+)\"$"; 4 string conn = "Data Source=.;Initial Catalog=seodb;Integrated Security=True"; 5 using (SqlBulkCopy sbc = new SqlBulkCopy(conn)) 6 { 7 TxtDataReader reader = TxtDataReader.ExecuteReader(file, pattern); 8 sbc.DestinationTableName = "dbo.test"; 9 try 10 { 11 sbc.WriteToServer(reader); 12 } 13 catch (Exception ex) 14 { 15 16 } 17 finally 18 { 19 reader.Close(); 20 } 21 } 22 23 }
备注:
1.如果其他场合需要以reader[int]或reader[string]形式获取读取器重的方法,需实现索引器。如需使用其他IDataReader接口定义的方法,同样。
参考代码:
1 public object this[string name] 2 { 3 get { return items[name]; } 4 } 5 6 public object this[int i] 7 { 8 get { return items[i]; } 9 } //Console.WriteLine(reader["ip"]);
2.为让示例代码简单清晰,其他未提供具体实现的IDataReader代码放在了分部类中。
3.当前所述解决的问题是解析日志文件并导入数据库中,只提供了满足当前需求的精简代码,甚至不包含必要的异常处理,数据截断、溢出等处理,如在实际用途中使用,需自行扩展和添加代码。
4.简单的、仅具参考价值的测试:windows xp\.net 2.0 \sql server 2005\2G内存 217M大小正式站日志文件,处理十次,平均时间35秒。
相关文章推荐
- (转载)SQL Server 2005 日志文件过大处理
- (转载)SQL Server 2005 日志文件过大处理
- 【转载】SQL Server 2008 收缩日志 清空删除大日志文件
- 将txt文件内容导入sql server 数据库表中
- 【转载】sql server日志文件总结及日志满的处理办法
- SQL Server 2008 收缩日志 清空删除大日志文件 转载
- asp.net 导入CSV 文件内容 到 SQL Server 数据库 解决CSV内容数据重复添加问题
- [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?
- (转载)SQL Server 2005 日志文件过大处理
- sql server 2005 压缩实例下所有数据库文件及日志文件(转载)作者:Program Life
- SQL Server如何导入mdf,ldf文件(转载)
- sql server 文件夹下的所有txt文件内容导入到数据库表中;远程备份到服务器
- 转载:SQL Server 2005无日志文件附加数据库
- (转载)SQL Server 2005 日志文件过大处理
- SQL Server 2012日志文件误删除数据库质疑后的相关恢复
- 【转载】Asp.NET大文件上传组件开发总结(三)---处理文件内容
- [SQL Server] 数据库日志文件自动增长导致连接超时的分析
- SQL SERVER 2005 镜像数据库截断并收缩日志文件的思路和操作
- SQL Server 2008 R2 清空日志文件(ldf直接清空)
- 使用RandomAccessFile 对日志文件读取,以及读取追加的文件内容。