把CSDN泄露的账户数据转成SQL语句 - 补充导入数据库的操作

原创 2012年03月29日 15:31:40
            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);
                }
            }


PHP程序,将csv转成sql文件并导入数据库

PHP程序,将csv转成sql文件并导入数据库代码的由来最近接手一个老项目,经过了多名程序员开发,因为公司不大,之前的交接做的也不好,很多业务逻辑都没有书面描述,一些需要功能还需要程序员手工处理,所以...

如何优化操作大数据量数据库——改善SQL语句(转)

很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:select*from table1 wherename='zhangsan...

mysql数据库常用的基本SQL语句--数据库数据操作

紧接上一篇博客,上一篇介绍了有关数据库表的一些有关操作,这一篇介绍在数据库里面对于数据增、删、改、查的一些语句。 上一篇连接:http://blog.csdn.net/u010889616/artic...

Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据,我们希望把这些数据导入到MySQL数据库中。phpMyadmin可以把MySQL数据库中的数据导出为JSON格式文件,但却...

[数据库] SQL查询语句表行列转换及一行数据转换成两列

本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法、子查询的应用、decode函数的用法。希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同...

从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:

来源:http://www.cnblogs.com/MeChecksV/articles/960793.html /*=========================================...

Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据,我们希望把这些数据导入到MySQL数据库中。phpMyadmin可以把MySQL数据库中的数据导出为JSON格式文件,但却...

access 转成sql2000数据库方法

1,打开”控制面板“下”管理工具“中的”数据库源“; 2,按”添加“添加一个新的数据源,在选择栏里选”Driver do microsoft Access (*.mdb)”,完成后将出现一个框, 在”...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把CSDN泄露的账户数据转成SQL语句 - 补充导入数据库的操作
举报原因:
原因补充:

(最多只允许输入30个字)