把CSDN泄露的账户数据转成SQL语句 - 补充导入数据库的操作
2012-03-29 15:31
471 查看
string sql = "insert into dbo.CsdnAccount (UserName, Password, Email) values ('{0}', '{1}', '{2}') "; using (StreamReader streamreader = new StreamReader(@"D:\www.csdn.net.data")) { string s = streamreader.ReadLine(); while (s != null) { string username = s.Split('#')[0].Trim(); string password = s.Split('#')[1].Trim(); string email = s.Split('#')[2].Trim(); using (StreamWriter streamwrite = new StreamWriter(@"D:\www.csdn.net.txt", true)) { streamwrite.WriteLine(string.Format(sql, username, password, email)); streamwrite.WriteLine("\n"); } s = streamreader.ReadLine(); } }
我要把这些数据直接导入数据库中,由于数据量非常庞大,因此我考虑使用SqlBulkCopy进行批量插入。
首先,创建一个DataTable,与数据库中的表对应:
USE [CSDNData] GO CREATE TABLE [dbo].[Account]( [UserName] [nvarchar](128) NULL, [Password] [nvarchar](128) NULL, [Email] [nvarchar](256) NULL ) ON [PRIMARY] GO
private DataTable CreateTable() { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("UserName", typeof(string))); dt.Columns.Add(new DataColumn("Password", typeof(string))); dt.Columns.Add(new DataColumn("Email", typeof(string))); return dt; }
然后,定义一个SqlBulkCopy插入数据的函数:
private void WriteToServer(DataTable dt) { string connectionString = @"Data Source=DST42796\SqlExpress;Initial Catalog=CSDNData;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connectionString)) { SqlBulkCopy bulk = new SqlBulkCopy(conn); bulk.DestinationTableName = "Account"; bulk.BatchSize = dt.Rows.Count; if (dt != null && dt.Rows.Count != 0) { conn.Open(); bulk.WriteToServer(dt); } bulk.Close(); } }
最后,从本地下载的泄露账户文件中,把数据导入数据库中,每2000条导入一次:
using (StreamReader streamreader = new StreamReader(@"D:\www.csdn.net.data")) { string s = streamreader.ReadLine(); DataTable dt = CreateTable(); while (!string.IsNullOrWhiteSpace(s)) { string username = s.Split('#')[0].Trim(); string password = s.Split('#')[1].Trim(); string email = s.Split('#')[2].Trim(); DataRow newrow = dt.NewRow(); newrow["UserName"] = username; newrow["Password"] = password; newrow["Email"] = email; dt.Rows.Add(newrow); if (dt.Rows.Count % 2000 == 0) { WriteToServer(dt); Thread.Sleep(2000); dt = CreateTable(); } s = streamreader.ReadLine(); } }
每2000条效率太差,优化后的程序是每一百万条导入一次:
using (StreamReader streamreader = new StreamReader(@"D:\www.csdn.net.data", Encoding.GetEncoding("GB2312"))) { string s = streamreader.ReadLine(); DataTable dt = CreateTable(); int i = 0; while (!string.IsNullOrWhiteSpace(s)) { string username = s.Split('#')[0].Trim(); string password = s.Split('#')[1].Trim(); string email = s.Split('#')[2].Trim(); DataRow newrow = dt.NewRow(); newrow["UserName"] = username; newrow["Password"] = password; newrow["Email"] = email; dt.Rows.Add(newrow); if (dt.Rows.Count % 1000000 == 0) { WriteToServer(dt); Thread.Sleep(30000); dt = CreateTable(); } s = streamreader.ReadLine(); i++; } if (i > 6000000) { WriteToServer(dt); } }
相关文章推荐
- Java学习篇之SQL语句(操作数据库和数据表)
- SQL 数据的导入导出,对远程(MSsql,OracleAccess,)数据库的操作以及读取Excel,txt文件中的数据
- 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
- 我们曾经心碎的数据库之 用SQL语句操作数据
- 用SQL语句对数据库数据导入导出
- 如何优化操作大数据量数据库(几十万以上数据)(二。改善SQL语句)
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作-------sql方式
- SQL语句操作数据与一些函数使用的丰富数据库
- 怎样用SQL Server 2008 SQL语句将Excel数据导入到数据库里指定的表里面?(
- 黑马程序员_学习日记48_616数据库开发及ADO.Net(带参数的Sql语句、数据库与文本文件导入导出、省市联动、资料管理器、DataSet (ado.net断开式数据访问)、SQLHelper)
- mysql数据库常用的基本SQL语句--数据库数据操作
- 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
- 把Excel表中的数据导入sql service数据库的语句
- SQL语句CVS文件数据导入数据库
- 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
- 数据库-T-SQL 语句-创建表,删除表,CRUD操作的添加数据,修改数据,删除数据
- excel数据通过构建sql语句导入到数据库中
- C#数据库编程基础之sql语句操作数据库数据
- 6.(Mysql数据管理相关)连接MYSQL,修改密码,增加新用户,数据库相关命令,表操作相关命令,数据相关命令,数据库sql导入和导出,备份数据库,查看不到mysql数据库的解决办法
- SQL语句将表中数据导入到另一个数据库表中