收录日期:2019/12/07 11:53:56 时间:2016/06/07 20:55:18 标签:C#
一个数据转换程序
this.sqlDataAdapter1.SelectCommand.CommandText="SELECT * FROM bmk";
this.sqlDataAdapter1.Fill(dataSet11,"bmk");
this.sqlDataAdapter1.SelectCommand.CommandText="SELECT DISTINCT KS_H FROM bmk ORDER BY KS_H";

this.sqlDataAdapter1.Fill(dataSet11,"bmkfilter");
progressBar1.Maximum=dataSet11.Tables["bmkfilter"].Rows.Count;
label1.Refresh();
label1.Text="共有"+dataSet11.Tables["bmk"].Rows.Count+"条数据,将处理成"+dataSet11.Tables["bmkfilter"].Rows.Count+"条数据。。。。。。";
for(int i=0;i<dataSet11.Tables["bmkfilter"].Rows.Count;i++)
{
Application.DoEvents();
this.sqlDataAdapter2.InsertCommand.CommandText="INSERT INTO gkdata(num) VALUES (@num)";
this.sqlDataAdapter2.InsertCommand.Parameters.Add("@num",dataSet11.Tables["bmkfilter"].Rows[i]["KS_H"].ToString());
this.sqlDataAdapter2.InsertCommand.Connection.Open();
this.sqlDataAdapter2.InsertCommand.ExecuteNonQuery();
this.sqlDataAdapter2.InsertCommand.Connection.Close();
this.sqlDataAdapter2.InsertCommand.Parameters.Clear();
dataView1.RowFilter="KS_H='"+dataSet11.Tables["bmkfilter"].Rows[i]["KS_H"].ToString()+"'";
dataView1.Sort="KM_H";
k=1;
foreach(DataRowView myDrv in dataView1)
{
ins_1="a"+k.ToString();
ins_2="a"+Convert.ToString(k+1).ToString();
for(int j=0;j<dataView1.Table.Columns.Count;j++)
{
this.sqlDataAdapter2.UpdateCommand.CommandText="UPDATE gkdata SET "+ins_1+"=@"+ins_1+","+ins_2+"=@"+ins_2+" where num="+myDrv[3].ToString();
this.sqlDataAdapter2.UpdateCommand.Parameters.Add("@"+ins_1+"",myDrv[2].ToString());
this.sqlDataAdapter2.UpdateCommand.Parameters.Add("@"+ins_2+"",myDrv[1].ToString());
this.sqlDataAdapter2.UpdateCommand.Connection.Open();
this.sqlDataAdapter2.UpdateCommand.ExecuteNonQuery();
this.sqlDataAdapter2.UpdateCommand.Connection.Close();
this.sqlDataAdapter2.UpdateCommand.Parameters.Clear();
}
k=k+2;
}
progressBar1.Value++;
label2.Refresh();
label2.Text=Convert.ToString(i+1);
}
label1.Refresh();
label1.Text="处理完毕,已经将"+dataSet11.Tables["bmk"].Rows.Count+"条数据处理成"+dataSet11.Tables["bmkfilter"].Rows.Count+"条数据!";

处理10000条数据竟然要差不多1个小时。。是用了dataview速度慢了,还是程序思路有问题,还是要用到线程,请高手指点,,
这样容易看一点

this.sqlDataAdapter1.SelectCommand.CommandText="SELECT * FROM bmk";
this.sqlDataAdapter1.Fill(dataSet11,"bmk");
this.sqlDataAdapter1.SelectCommand.CommandText="SELECT DISTINCT KS_H FROM bmk ORDER BY KS_H";
this.sqlDataAdapter1.Fill(dataSet11,"bmkfilter");
progressBar1.Maximum=dataSet11.Tables["bmkfilter"].Rows.Count;
label1.Refresh();
label1.Text="共有"+dataSet11.Tables["bmk"].Rows.Count+"条数据,将处理成"+dataSet11.Tables["bmkfilter"].Rows.Count+"条数据。。。。。。";
for(int i=0;i<dataSet11.Tables["bmkfilter"].Rows.Count;i++)
{
    Application.DoEvents();
    this.sqlDataAdapter2.InsertCommand.CommandText="INSERT INTO gkdata(num) VALUES (@num)";
    this.sqlDataAdapter2.InsertCommand.Parameters.Add("@num",dataSet11.Tables["bmkfilter"].Rows[i]["KS_H"].ToString());
    this.sqlDataAdapter2.InsertCommand.Connection.Open();
    this.sqlDataAdapter2.InsertCommand.ExecuteNonQuery();
    this.sqlDataAdapter2.InsertCommand.Connection.Close();
    this.sqlDataAdapter2.InsertCommand.Parameters.Clear();
    dataView1.RowFilter="KS_H='"+dataSet11.Tables["bmkfilter"].Rows[i]["KS_H"].ToString()+"'";
    dataView1.Sort="KM_H";
    k=1;
    foreach(DataRowView myDrv in dataView1)
    {
ins_1="a"+k.ToString();
ins_2="a"+Convert.ToString(k+1).ToString();
for(int j=0;j<dataView1.Table.Columns.Count;j++)
{
            this.sqlDataAdapter2.UpdateCommand.CommandText="UPDATE gkdata SET "+ins_1+"=@"+ins_1+","+ins_2+"=@"+ins_2+" where num="+myDrv[3].ToString();    this.sqlDataAdapter2.UpdateCommand.Parameters.Add("@"+ins_1+"",myDrv[2].ToString());
            this.sqlDataAdapter2.UpdateCommand.Parameters.Add("@"+ins_2+"",myDrv[1].ToString()); this.sqlDataAdapter2.UpdateCommand.Connection.Open(); this.sqlDataAdapter2.UpdateCommand.ExecuteNonQuery(); this.sqlDataAdapter2.UpdateCommand.Connection.Close(); this.sqlDataAdapter2.UpdateCommand.Parameters.Clear();
}
      k=k+2;
      }
      progressBar1.Value++;
      label2.Refresh();
      label2.Text=Convert.ToString(i+1);
}
label1.Refresh();
label1.Text="处理完毕,已经将"+dataSet11.Tables["bmk"].Rows.Count+"条数据处理成"+dataSet11.Tables["bmkfilter"].Rows.Count+"条数据!";
本来数据类型是
表bmk
id  KH_D  KM_H  KS_H
1   244   2     1001
2   342   4     1002
3   423   3     1001
4   342   10    1003

要把插入表bmkfilter
id  num   a1   a2   a3   a4   a5   a6   a7   a8   a9  a10 .....
1   1001  2   244   3    423  null null null null null null..
1   1002  4   342   null null null null null null null null.....
..............
这样的问题用存储过程解决,干吗要搞到前台来?有点搞不懂,你第二表id 怎么有重复的 ?
这么点数据量,居然运行一个小时。大概看啦你的程序思路,大概也没有错误,我想这个问题应当是对数据库优化问题。
首先使用存储过程效率应当会有提高,不过我想提高的也许有限。这个取决于机器的性能。因为数据量不是很大,存储过程使用数据库所在服务器的资源,而程序使用终端机的资源,最大差别是网络传输。而网络传输数据量不大的情况,差别不大。

我想你需要建立索引,已增加数据的查询速度和插入速度。还有插入表如果建立主键,插入速度也会增加的。当然就不能有重复记录出现。
建立主键插入速度将降低,不过建立主键则自动建立索引,所以将提高速度,归根结底还是建立索引。我上面的帖子存在这个说法错误,见谅
插入表bmkfilter搞错了。。是
id  num   a1   a2   a3   a4   a5   a6   a7   a8   a9  a10 .....
1   1001  2   244   3    423  null null null null null null..
2  1002  4   342   null null null null null null null null.....

id列主键都建立了。其他列的索引倒是没有建
存储过程不太熟。只能用程序做。因为只用一次,但是要求处理时间要几分钟。。。烦啊
你可以将程序运行时间打出来,就是分别看看读取数据库SELECT * FROM bmk需要多长时间。还有插入10条数据需要多长时间。取时间应当是System.DateTime.Now.ToString(),
如果是读取数据库慢就增加数据库缓存试一试。如果是插入慢,就将主键删除再插入试一试。要是插入10条数据很快就完成了。而后边的插入越来越慢就是数据库主键的问题。每插入一条都要校验是否有重复的。
等全部插入后再对这个表建立主键。(有数据的表估计建立主键速度也不会快)
还有估计就是你的数据库服务器性能比较差。要不然这么点数据,也就几分钟的事情。要是硬件的问题,怎么做都白搭。看看你的数据库服务器的配置,还有终端机的配置。还有服务器内存、CPU使用情况。
谢谢,,明天去办公室试试。
我是先把60000万条数据先读入dataset的,这段读取时间很短。也就几秒,读完才用dataview在dataset里面筛选,,这样的话,在原表建立索引有用么?
up
先读取到DataSet中,再进行筛选。在数据库中建立的索引当然没有用处了。
写一个存储过程来处理
除了
SELECT DISTINCT KS_H FROM bmk ORDER BY KS_H

这部分用datatable来保存外,其他都者可以直接通过数据库统计获得
60000万条数据先读入dataset的??!!! 你的内存多大阿??
insert into ..() select * from......
您用的是远程数据源,您应该到SQL讨论组获取更多的帮助,因为在服务器上运行SQL脚本会快很多,而且比较直接,但希望您写的东西只用一次
1、将数据分页提取。
2、因为是连续处理,所以连接只打开和关闭一次。
按理说这块筛选的logic应写在前台。但性能太差,最好的办法就是把它写在存储过程里了。
一、使用存储过程;
二、分解为简单的两个行转列问题;写入临时表;
三、将两个行转列临时表合并。
这个是行列转置问题,用存储过程处理,建上合理的索引,10000条左右的数据基本1秒左右就可以处理完,你可以看一下邹健写的那本书,上面有例子
建议你用SqlDataReader获取数据,这样就不需要DataSet,也不会很占内存。
如果你用的是.NET Framework 2.0 可以利用SqlBulkCopy类批量复制,MSDN帮助文件为:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/html/83a7a0d2-8018-4354-97b9-0b1d99f8342b.htm

运算符---枚举---循环变量 修改一段代码,boost , 提取静态 url 程序编译通过,但没有结果, 看看怎么修改? C# 三种常用的拼接字符串性能比 strconv转换后数据丢失????? 求思路,在WinForm上用C#利用Google Map API做一个地图,实现输入经纬值即可定位 这周又有同学考驾照。继续求祝福。 项目在VS2008中编译出错,错误信息是:无法打开文件“.\\objchk\\i386\\genprintIorw.sbr WinLicense授权系统SDK开发 web 各位懂的帮帮忙。。。 34岁了,准备做程序员 CRectTracker绘制的矩形 不能正常显示 又周五了, 散点分 最新 微软 面试题 qmake的问题 热火今天还要逆转吗?目前输公牛12分~ 星期四顶着黑眼圈上班 菜鸟求学Spring,恳求请大家指点一下! Sql Server2008linkOracle 更新Oracle数据 疑难问题 去日本学IT怎么样? 【zhangzong52021】继续支援 .NET用MySQL中插入数据 不报错,插入NULL 求救 联通短讯API接口问题,求助!最后50分了! iptables做端口映射后,无法获取客户端真实ip的问题 怎么创建一个窗体上面有几个按钮,一个文本框 收藏 各位大神 请教一下关于外接ROM的问题 附图 在线等回 Request.Form获取相同Name的数组遇到逗号怎么办 求指导bat里面怎么比对字符串? 回复编辑框里不能用TAB键? 在OpenCMS中编辑了一个index.html页面,发布后,单击index.html后,浏览器无法跳出这个页面,出现异常: