您的位置:首页 > 数据库 > SQL

【转载】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 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秒。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: