利用Hashtable体会优化的概念
【IT168 技术文档】
目标:把文本文件的数据直接更新到数据库中。
文本文件内容 :
壁 $ 1ET.710.2408.3MX $ . $ 8钢板Q235-A.F $ 5ET.022.8808.1MX $ 8ET.052.2922 @
壁 $ 1ET.710.2408.3MX $ . $ 8钢板Q235-A.F $ 5ET.022.8808.1MX $ 8ET.052.156.3 @
壁 $ 1ET.710.2408.3MX $ . $ 8钢板Q235-A.F $ 5ET.022.8808.1MX $ 8ET.052.2922 @
管接头 $ 1ET.710.2408.3MX $ L=130 $ . $ 5ET.022.8808.1MX $ 5ET.458.3197.5 @
算法:以$分割每个字符串,然后把分割后的数据依次存储到数据库中。
Sql Server:CREATE TABLE [dbo].[mx_hjyx] (
[part] [varchar] (20) COLLATE Chinese_PRC_BIN NOT NULL ,
[guige] [varchar] (40) COLLATE Chinese_PRC_BIN NOT NULL ,
[cllikmycg] [char] (90) COLLATE Chinese_PRC_BIN NOT NULL ,
[mycg] [varchar] (50) COLLATE Chinese_PRC_BIN NULL ,
[jsdh] [varchar] (20) COLLATE Chinese_PRC_BIN NULL ,
[sszj] [varchar] (20) COLLATE Chinese_PRC_BIN NULL
) ON [PRIMARY]
利用的组件:openFileDialog,dataGrid,SqlDataAdapter,SqlConnection
代码如下:
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
DateTime time=DateTime.Now;//记录当前时间
dataGrid1.DataSource=null;//先不把文本文件的内容显示出来
StreamReader st=new StreamReader(this.openFileDialog1.FileName,System.Text.Encoding.Default,true);
for(;<img src="images/smilies/23.gif" border="0" alt="白眼">
{
data=st.ReadLine();//读取一行
if(data==null) break;//是否有数据
if(data.Trim()=="") continue;//如果数据是空行,继续
data=data.Trim();
if(data.EndsWith("@"))//如果以@结尾
{
if(!data.Trim().StartsWith("$"))
insert(data.Trim().Trim('@ '));
}
else
{
data0=st.ReadLine().Trim();//再取一行
if(!data0.Trim().EndsWith("@"))
data0=data0.Trim()+st.ReadLine().Trim(); if(!data.StartsWith("$"))
insert(data.Trim()+data0.Trim().Trim('@ '));
data0="";
}//数据不能以$开头,还必须以@结尾
}
st.Close();
DataRowView rv1=dataSet12.mx_hjyx.DefaultView.AddNew();
rv1.Delete();//防止最后一行是关键字,有可没有插入到数据库,就报关键字不能为空的错误
DateTime time1=DateTime.Now;//程序结束时间
TimeSpan sss=time1-time;//时间差
dataGrid1.DataSource=dataSet11.mx_hjyx.DefaultView;
dataGrid1.CaptionText=sss.ToString();//时间显示在dataGrid1上
}
在程序中调用insert函数,代码如下:
private void insert(string str)
{
DataRowView rv=dataSet11.mx_hjyx.DefaultView.AddNew();
string[] r=str.Split('$');//以$分开,存储到数组
for(int i=0;i<r.Length;i++)
{
r[i]=r[i].Trim();
if(r[i]=="") r[i]=".";
}//去调空格
string filler;
if(r.Length>5)
{
filler=r[2].ToUpper()+","+r[5].ToUpper()+","+r[3].ToUpper();
//part,cllikmycg,guige为关键字,不允许重复数据
if(ht[filler]!=null)
{
rv.Delete();
return;
}
else ht.Add(filler,"0");//把数据存储到Hashtable中,防止重复
rv["mycg"]=r[0];
rv["jsdh"]=r[1];
rv["guige"]=r[2];
rv["cllikmycg"]=r[3];
rv["sszj"]=r[4];
rv["part"]=r[5];
}
}
读取的代码写完了,在这之间把SqlDataAdapter配置一下,生成dataSet11
不要忘记定义Hashtable;
public Form1()
{
InitializeComponent();
ht=new Hashtable();
}
另一种方法是直接利用:
DataView rr=new DataView(dataSet11.mx_hjyx);
rr.RowFilter=r[2].ToUpper()+","+r[5].ToUpper()+","+r[3].ToUpper();
测试一下你会发现:
Hashtable只会用几秒中时间就能处理4M的文本文件。
而RowFilter过滤会花4分钟的时间。