ACCESS数据库转换到SQL数据库   由于表结构、字段设置等都不一样  还需要加密  所以写这个转换程序  但是当转换前4W条时  速度可达到3000条/分钟   4W条以后数据立即就变为平均1条/秒了  请问是怎么 回事?if (access()==1 || sql()==1) return;//判断数据库连接是否正确的一个方法
int dlcs=0,yhid=1,yhxb=1,jinbi=0,Mshen=0,Mbai=0,Mpin=0,Mtaopao=0,Dshen=0,Dbai=0,Dpin=0,Dtaopao=0,Mdlcs=0,Ddlcs=0,Myxsc=0,Dyxsc=0,Mduan=0,Dduan=0;//,newid=1
string yhmc="",dzyj="",yhmm="",tswt="",wtda="",dlip="",zcsj="",zsxm="",lxdz="",yzbm="",sfz="";
OleDbConnection conn=new OleDbConnection();
conn.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;" +@"Data source="+aa1;
OleDbCommand linshi3=new OleDbCommand("select count(linshi) from "+aa2+"",conn);//判断linshi字段是否存在
OleDbCommand linshi7=new OleDbCommand("select count(user_id) from "+aa2+"",conn);//取得需转换的用户数量
OleDbCommand linshi6=new OleDbCommand("alter table USER_BASE_INFO ADD linshi integer",conn);//建立linshi字段
OleDbCommand linshi10=new OleDbCommand("select top 1 * from USER_BASE_INFO where linshi is null",conn);//取出一条未转换的用户数据
//OleDbCommand linshi27=new OleDbCommand("insert into USER_BASE_INFO (linshi) values (1) where user_id="+yhid+"",conn);
int shuliang=1;
try 
{conn.Open(); OleDbDataReader linshi4=linshi3.ExecuteReader();
if (linshi4.Read()) {linshi4.Close();
OleDbDataReader linshi8=linshi7.ExecuteReader();
if (linshi8.Read()) shuliang=linshi8.GetInt32(0); linshi8.Close();}
else{linshi4.Close(); OleDbDataReader linshi5=linshi6.ExecuteReader();
if (linshi5.Read()){} else{} linshi5.Close();}}
catch{ OleDbDataReader linshi5=linshi6.ExecuteReader();
if (linshi5.Read()){} else{} linshi5.Close();
OleDbDataReader linshi4=linshi7.ExecuteReader();
if (linshi4.Read()) {shuliang=linshi4.GetInt32(0); linshi4.Close();}}
finally {conn.Close();}
conn.Open();
sjk.DatabaseOperate sqlconn=new DatabaseOperate();
ybgame.mima jj=new ybgame.mima();//加密类
int nan=4,girl=0;//定义男头像从4开始,女头像从0开始
int tou=0;
int kaishi=Convert.ToInt32(textBox8.Text);
for (int i=kaishi;i<=shuliang;i++)
{
//conn.Open();
OleDbDataReader linshi12=linshi10.ExecuteReader();
if (linshi12.Read())
{
yhid=linshi12.GetInt32(0);//取得用户ID
yhmm=linshi12.GetString(1).Trim();//取得用户密码
jinbi=linshi12.GetInt32(3);//取得金币数量
//yhxb=linshi12.GetInt32(5);// 取得用户性别???????
string xingbie=linshi12.GetString(5).Trim();
if (xingbie=="男") 
{
yhxb=0;
nan=nan+1;
if (nan>7) nan=4;
tou=nan;
}
else 
{
girl=girl+1;
if (girl>3) girl=0;
tou=girl;
} dzyj=linshi12.GetValue(6).ToString().Trim();//取得用户EMAIL
yhmc=linshi12.GetValue(7).ToString();//取得用户名称
tswt=linshi12.GetValue(8).ToString();//取得提示问题
wtda=linshi12.GetValue(9).ToString();//取得问题答案
zcsj=linshi12.GetValue(14).ToString().Trim();//取得注册时间
zsxm=linshi12.GetValue(15).ToString().Trim();//取得真实姓名
lxdz=linshi12.GetValue(16).ToString().Trim();//取得联系地址
yzbm=linshi12.GetValue(17).ToString().Trim();//取得邮政编码
//if (yb!="") yzbm=Convert.ToInt32(yb);
dlcs=linshi12.GetInt32(18);//取得用户登陆次数
sfz=linshi12.GetValue(19).ToString().Trim();//取得身份证
dlip=linshi12.GetValue(24).ToString().Trim();//取得用户注册登陆IP
}
else
{
label9.Visible=true;
label9.Text="取ACCESS表用户信息时出现错误!!";
}
linshi12.Close();
OleDbCommand linshi13=new OleDbCommand("select top 1 * from USER_SCORE_INFO where USER_NAME='"+yhmc+"'",conn);//取得用户对应的麻将游戏信息
OleDbCommand linshi14=new OleDbCommand("select top 1 * from USER_DDZ_SCORE where USER_NAME='"+yhmc+"'",conn);//取得用户对应的斗地主游戏信息
数据的转换";

解决方案 »

  1.   

    //*****************************************取得麻将游戏相关信息开始*********************
    OleDbDataReader linshi15=linshi13.ExecuteReader();
    if (linshi15.Read())
    {
    Mdlcs=linshi15.GetInt32(1);//取得登陆次数
    Myxsc=linshi15.GetInt32(2);//取得总游戏次数
    Mshen=linshi15.GetInt32(3);//取得胜利次数
    Mbai=linshi15.GetInt32(4);//取得失败次数
    Mtaopao=linshi15.GetInt32(5);//取得逃跑次数
    //Mduan=Convert.ToInt32(linshi15.GetValue(6).ToString().Trim());//取得断线次数
    Mduan=linshi15.GetInt32(6);//取得断线次数
    Mpin=Myxsc-Mshen-Mbai-Mtaopao-Mduan;
    if (Mpin<0) Mpin=0;
    }
    else
    {
    // label9.Visible=true;
    // label9.Text="取ACCESS表麻将信息时出现错误!!";
    // return;
    }
    linshi15.Close();
    //*****************************************取得麻将游戏相关信息结束*********************
    //*****************************************取得斗地主游戏相关信息开始*********************
    OleDbDataReader linshi16=linshi14.ExecuteReader();
    if (linshi16.Read())
    {
    Ddlcs=linshi16.GetInt32(1);//取得登陆次数
    Dyxsc=linshi16.GetInt32(2);//取得总游戏次数
    Dshen=linshi16.GetInt32(3);//取得胜利次数
    Dbai=linshi16.GetInt32(4);//取得失败次数
    Dtaopao=linshi16.GetInt32(5);//取得逃跑次数
    //Dduan=Convert.ToInt32(linshi16.GetValue(6).ToString().Trim());//取得断线次数
    Dduan=linshi16.GetInt32(6);//取得断线次数
    Dpin=Dyxsc-Dshen-Dbai-Dtaopao-Dduan;
    if (Dpin<0) Dpin=0;
    }
    else
    {
    // label9.Visible=true;
    // label9.Text="取ACCESS表斗地主信息时出现错误!!";
    // return;
    }
    linshi16.Close();
    //*****************************************取得斗地主游戏相关信息结束*********************
    //conn.Close();

    yhmm=jj.passwordB(yhmm);
    //#################################################新SQL录入开始##############################
    //sjk.DatabaseOperate sqlconn=new DatabaseOperate();//数据库操作类
    //>>>>>>>>>>>>>>>>>>>>>>写入用户基本信息
    string[] strColNames1 = {"userName","iconID","age","gender","email","hashPasswd","regTime","regIp","totalOnlineTime","nickName"};//存放数据库字段的名称
    object[] objColValues1 = {yhmc,tou,18,yhxb,dzyj.Replace("'","''"),yhmm,zcsj,dlip,dlcs,yhmc.Replace("'","''")};//存放从页面窗体取到的值
    if(sqlconn.InsertRecord("UserInfo",strColNames1,objColValues1)){}
    else{label9.Visible=true;label9.Text="写入SQL表用户信息时出现错误!!"; return;}
    //>>>>>>>>>>>>>>>>>>>>>取得新录入用户的用户ID号
    // SqlDataReader linshi30=sqlconn.GetDataReader("select max(userID) from UserInfo");
    // SqlDataReader linshi30=sqlconn.GetDataReader("select top 1 userID from UserInfo order by userID desc");
    // if (linshi30.Read()) {newid=linshi30.GetInt32(0); linshi30.Close();}  else {linshi30.Close(); return;}
    // newid=i;

    //>>>>>>>>>>>>>>>>>>>>>将该用户的其它信息写入Userelse表
    string[] strColNames12 = {"userID","tswt","wtda"};//存放数据库字段的名称
    object[] objColValues12 = {i,tswt.Replace("'","''"),wtda.Replace("'","''")};//存放从页面窗体取到的值
    if(sqlconn.InsertRecord("Userelse",strColNames12,objColValues12)){}
    else{label9.Visible=true;label9.Text="写入SQL表用户的其它信息时出现错误!!"; return;}
    //>>>>>>>>>>>>>>>>>>>>>将该用户的金币信息写入UserAccount表
    string[] strColNames2 = {"userID","money"};//存放数据库字段的名称
    object[] objColValues2 = {i,jinbi};//存放从页面窗体取到的值
    if(sqlconn.InsertRecord("UserAccount",strColNames2,objColValues2)){}
    else{label9.Visible=true;label9.Text="写入SQL表用户的金币信息时出现错误!!"; return;}
    //>>>>>>>>>>>>>>>>>>>>>写入用户斗地主相关信息
    string[] strColNames3 = {"userID","gameID","score","winGames","lossGames","equalGames","escGames"};//存放数据库字段的名称
    object[] objColValues3 = {i,1,0,Dshen,Dbai,Dpin,Dtaopao};//存放从页面窗体取到的值
    if(sqlconn.InsertRecord("GameInfo",strColNames3,objColValues3)){}
    else{label9.Visible=true;label9.Text="写入SQL表用户的用户斗地主相关信息时出现错误!!"; return;}
    //>>>>>>>>>>>>>>>>>>>>>写入用户麻将相关信息
    string[] strColNames4 = {"userID","gameID","score","winGames","lossGames","equalGames","escGames"};//存放数据库字段的名称
    object[] objColValues4 = {i,2,0,Mshen,Mbai,Mpin,Mtaopao};//存放从页面窗体取到的值
    if(sqlconn.InsertRecord("GameInfo",strColNames4,objColValues4)){}
    else{label9.Visible=true;label9.Text="写入SQL表用户的用户麻将相关信息时出现错误!!"; return;}
    //#################################################新SQL录入结束############################## //***************************************为已转换用户增加标记开始*********************

    OleDbCommand linshi27=new OleDbCommand("update USER_BASE_INFO set linshi=1 where user_id="+yhid+"",conn);
    //
    int tt=linshi27.ExecuteNonQuery();
    //***************************************为已转换用户增加标记结束*********************
    //
    label9.Visible=true;
    label9.Text="已完成:"+i+"/"+shuliang;
    label9.Refresh();
    }
    conn.Close();
    // Form2 ct2=new Form2(label10.Text);
    // ct2.Show();
    progressBar1.Visible=false;
    label9.Text="已经成功完成"+shuliang+"条
      

  2.   

    设置个主键试试,再就是Access处理大量数据肯定不如SQL Server。
      

  3.   

    我将已ACCESS已转换数据删除   继续转换  仍然速度慢  所以分段录入是不现实的