技术开发 频道

利用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分钟的时间。

0
相关文章