十万条记录,怎样插入数据库最高效

ximomomoxinei1 2011-11-19 07:42:38
我现在从log文件(txt文件可以查看)里面读取到dataTable,用的是一个嵌套的for循环将log数据一行一行放到dataTable中。
我现在想把这些log文件放到数据库中,那么我暂时想到的有两种方式

方式1:先把所有数据读到dataTable,之后一次性放到数据库中的表。
方式2:不用dataTable了,直接在嵌套的for循环中一行一行的进行插入(用传统的insert一条一条插入)。

那种方式效率更高一些呢????
同时也有两个问题:

问题1:方式1中我把数据全都放在dataTable中,然后用什么sql语句进行一次性更新数据呢?(我只会一条一条的insert 有没有一次性插入许多行的sql语句)


问题2:我记得insert插入一条数据时open一次 close一次,如果十万条数据,那就open十万次 close十万次,这样是不是不合理?能否只open一次 close一次?
...全文
548 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
秒了个球球的 裤子都脱了 才发现复制了一半

 DataRow row = table.NewRow(); //创建一个DataRow对象
                row["StartTelNum"] = startTelNum;//一定要在一开始创建 table.Columns.Add("StartTelNum");
                row["city"] = city;
                row["TelType"] = telType;
                //row["TelXuHao"] = xuHao;
                table.Rows.Add(row);// NewRow只是创建,没有插入
            }
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr))
            {
                bulkCopy.DestinationTableName = "T_TelNum";
                bulkCopy.ColumnMappings.Add("StartTelNum", "StartTelNum");
                bulkCopy.ColumnMappings.Add("City", "TelArea");
                bulkCopy.ColumnMappings.Add("TelType", "TelType");
                //添加DataTable中列名和数据库表列名的映射
                //bulkCopy.ColumnMappings.Add("TelXuHao", "TelXuHao");
                bulkCopy.WriteToServer(table);
            }

            TimeSpan ts = DateTime.Now - starTime;
            MessageBox.Show(i1+"条数据" + ts.ToString());

        }
    }
}

  • 打赏
  • 举报
回复
喵了个咪的 我想知道为啥我发的帖子不能编辑 电话格式 区号没导入需要修改下才行 "号段" "所属地区" "号码类型" "区号" 1300000 "北京市" "联通" "010" 1300001 "江苏省常州市" "联通" "0519" 1300002 "安徽省巢湖市" "联通" "0565" 1300006 "江苏省南京市" "联通" "025" 1300008 "湖北省武汉市" "联通" "027" 1300010 "北京市" "联通" "010"
  • 打赏
  • 举报
回复

送的分忧啥用?


刚学到数据库 跟视频学做过 是VS2012 换了2010 打不开了 顺便重写下 好备份以后用 不知是不是你需要的

导入25W 电话号 4秒+ 把大概


---------------------------

---------------------------
258113条数据00:00:04.4687500
---------------------------
确定
---------------------------



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;
using Microsoft.Win32;
using System.IO;
using System.Data;
using System.Data.SqlClient;

namespace 手机号码导入
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void btnDaoRu_Click(object sender, RoutedEventArgs e)
{
string connStr=ConfigurationManager.ConnectionStrings["dbConnstr"].ConnectionString;
//找到打开导入文件
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
//判断是否选择了文件
if (ofd.ShowDialog() == false)
{
MessageBox.Show("请选择文件");
return;
}
string[] lines = File.ReadLines(ofd.FileName,Encoding.Default).ToArray();

DateTime starTime = DateTime.Now;

DataTable table = new DataTable();
table.Columns.Add("StartTelNum");
table.Columns.Add("City");
table.Columns.Add("TelType");
int i1 = 0;
for (int i = 1; i < lines.Length; i++)
{
i1++;
string line = lines[i];
string[] strs = line.Split('\t');

string startTelNum = strs[0];
string city = strs[1]; //出错点
city = city.Trim('"');//去除元素里的“”号
string telType = strs[2];
telType = telType.Trim('"');//去除元素里的“”号
string xuHao = strs[3];
xuHao = xuHao.Trim('"');//去除元素里的“”号
threenewbee 2013-07-13
  • 打赏
  • 举报
回复
如果是一过性的插入,直接把数据当作csv导入数据库就可以了。 如果字段没有用逗号分隔,你可以导入到一个临时表中,然后写一个简单的存储过程,处理每一行的字段。
缪军 2013-07-13
  • 打赏
  • 举报
回复
逐条读取,然后insert, 这样才有可能植入数据校验,抛出异常,断点续传,显示进度,和界面交互
全栈极简 2013-07-13
  • 打赏
  • 举报
回复
10万条在内存没有问题的,上千万才会存在效率问题。
Regan-lin 2013-07-13
  • 打赏
  • 举报
回复
那LZ可不可以把这些数据做成一个临时表然后再加入到dataTable?
patrickjiang 2013-07-13
  • 打赏
  • 举报
回复
我也有类似你的问题,对于十万条以上的数据,DataTable在内存中默认存储多少条?会不会不够?
  • 打赏
  • 举报
回复
直接用这个吧SqlBulkCopy
  • 打赏
  • 举报
回复
多线程,每个线程分批次写,最好用上事务
具体多少线程,每次写进多少,你可以自己写个程序多做测试,选一个最佳的方案
2-4个线程应该足矣
luluyy 2011-11-19
  • 打赏
  • 举报
回复
带TT插
krenyelang 2011-11-19
  • 打赏
  • 举报
回复
据我了解可以尝试使用下类型化数据集进行操作,在操作的时候将数据库打开!这样效率要高许多!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧