CSDN에서 유출된 계정 데이터를 SQL 문장으로 변환 - 데이터베이스 가져오기 작업 추가

5057 단어
            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("
"); } 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);
                }
            }

좋은 웹페이지 즐겨찾기