收录日期:2020/06/02 12:06:00 时间: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

什么控件可以中显示多帧图像 appendTitle与appendRow 方法的作用 有英语过六级的朋友吗?我想认识一下 代理服务器的问题 【测试】写出你知道的用JDK复制文件的所有方法。 线程中怎么使用Response.Writ 请问哪里可以找到codebase /codeplus 5.1 vs 2005中我在资源里加了个声音文件WAV的 Servlet中parameter和attribute的区别 公用 Form 应以什么格式方便共享? 把注册表HKEY_CURRENT_USER\\console全部删除后,现在命令行提示窗口无法改变大小,也出不来滚动条,里面有些字就是看不见 VS2003简单问题:对路径“D:\\WIN...”的访问被拒绝 C#中泛型的理解和使用 sql server 求和问题 dbx的使用 接口到底是作什么用的?? 图片在客服端不能显示,在服务器端能显示(在线等) 求助 Sql server支持不同网段通信吗? 招聘HR:你凭啥找到好工作 HELP!!! 用Eclipse实现一个功能 关于在校园网内开设网站 数据同步问题 帮看下 使freetextbox,在后台的数据库里的图片路径有点问题! 急,求助,求助!!!!关于recordset的问题 请问怎样快速判断两个矩阵是否相同 ORACLE数据同步问题 IDownloadManager 的 Download 如何才能被调用? 心急如焚:一小段代码搞不定了。怎么关闭这样的对话框。