c#在c/s模式下连接数据库总超时

风灵灬 2016-04-08 03:39:57
目的是为了实现从a库导入到b库,并对数据做简单处理
代码如下
conn1.Open();
conn2.Open();
try
{
string customername = "",customercontent="";
string sql = "select distinct registrant from domain_delete_backup where LEN(registrant)>4 and LEN(registrant)<50 and domain like '[吖-座]%'";
SqlDataAdapter ad1 = new SqlDataAdapter(sql, conn1);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn2;
DataSet ds = new DataSet();
DataSet ds2 = null;
DataSet ds3 = null;
DataTable dt = new DataTable();
dt.Columns.Add("customername", Type.GetType("System.String"));
ad1.Fill(ds);
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (i % 100 == 0)
{
conn1.Close();
conn2.Close();
}
if (conn1.State == ConnectionState.Closed)
conn1.Open();
if (conn2.State == ConnectionState.Closed)
conn2.Open();
customercontent = "";
customername = ds.Tables[0].Rows[i][0].ToString().Trim().Replace(" ", "").Replace("'", "’"); ;
sql = "select cid from customer where customername='" + customername + "'";
try
{
ad1 = new SqlDataAdapter(sql, conn2);
}
catch (Exception ee)
{
continue;
}
ds2 = new DataSet();
ad1.Fill(ds2);
if (ds2 != null && ds2.Tables.Count > 0 && ds2.Tables[0].Rows.Count > 0)
{
DataRow dr = dt.NewRow();
dr["customername"] = customername;
dt.Rows.Add(dr);
}
else
{
sql = "select domain,contact,email,registdate,expiredate from domain_delete_backup where registrant='" + customername + "'";
try
{
ad1 = new SqlDataAdapter(sql, conn1);
}
catch (Exception ex_)
{
continue;
}
ds3 = new DataSet();
ad1.Fill(ds3);
if (ds3 != null && ds3.Tables.Count > 0 && ds3.Tables[0].Rows.Count > 0)
{
for (int j = 0; j < ds3.Tables[0].Rows.Count; j++)
{
if (j > 100)
break;
customercontent += ds3.Tables[0].Rows[j]["domain"].ToString() + " " + ds3.Tables[0].Rows[j]["contact"].ToString() + " " + ds3.Tables[0].Rows[j]["email"].ToString() + " " + ds3.Tables[0].Rows[j]["registdate"].ToString() + " " + ds3.Tables[0].Rows[j]["expiredate"].ToString() + "\n\r";
}
sql = string.Format("insert into customer(cid,sourcecontent,customername,ctype,eid,isassign,indate,islarge) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','20')",
"cid" + DateTime.Now.ToString("yyyyMMddHHmmss") + i, customercontent.Replace("'", "’"), customername, "1", "yu", "0", DateTime.Now.ToString());
cmd.CommandText = sql;
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
continue;
}
}
}
}
}
SaveCSV(dt, "e:/asdzxccas.csv");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if (conn1.State == ConnectionState.Open)
conn1.Close();
if (conn2.State == ConnectionState.Open)
conn2.Close();
}

运行大概半小时左右就会报出异常,数据连接超时Timeout
涉及数据约20万条
...全文
550 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rx02120904 2017-10-25
  • 打赏
  • 举报
回复
请问一下,是怎么处理的
风灵灬 2016-04-12
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
除了一般的“滥用catch语句”以外,随便一看就能看到,你还有
                                catch (Exception ex_)
                                {
                                    continue;
                                }
这类更加严重地滥用catch语句的问题。 可以想象到,平常不解决程序 bug,一味地以掩盖问题、凑合蒙过去领导为目标,这样的程序肯定经常运行超时。
多谢,已解决
江南小鱼 2016-04-09
  • 打赏
  • 举报
回复
数据库连接对象有超时时间限制的,这种批量数据同步,一般可以从下面几个方向考虑: 1、利用sql server自身的复制机制,实现海量数据同步(这个效率是非常高的) 2、多线程同步 3、使用SqlBulkCopy批量把数据导入目标库,然后在目标库使用存储过程(把耗时放在服务器端处理)把数据进行处理同步
  • 打赏
  • 举报
回复
除了一般的“滥用catch语句”以外,随便一看就能看到,你还有
                                catch (Exception ex_)
                                {
                                    continue;
                                }
这类更加严重地滥用catch语句的问题。 可以想象到,平常不解决程序 bug,一味地以掩盖问题、凑合蒙过去领导为目标,这样的程序肯定经常运行超时。
  • 打赏
  • 举报
回复
贴出你的调试窗口或者打印信息! 你连哪一条语句运行时报错、这样的实际的信息都还不清楚呢吧?
SoulRed 2016-04-09
  • 打赏
  • 举报
回复
有可能不是代码的问题。看看数据库设置,是不是有连接时长限制。
秋的红果实 2016-04-08
  • 打赏
  • 举报
回复
根据你的需求,你可以整体从a导入到b,然后对b进行修改操作 你的代码,循环里套着循环,处理比较复杂,时间长了,内存也会受不了的 DataSet,SqlDataAdapter,sqlcommand这些的对象也要及时dispose();
qmanzbxv 2016-04-08
  • 打赏
  • 举报
回复
数据库会在连接池中自己管理连接,你这样是画蛇添足了。直接封装一个读数据函数,一个写数据函数,每次读完和写完直接关闭,下次读写时候再打开。数据库会自己管理连接池。你要提高效率,可以写数据时候开事务,关索引,关日志等等一系列方法。
风灵灬 2016-04-08
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
又一次成功,就表示代码无大问题 数据库使用完之后要关闭 既然是 C/S,那么出问题时有多少 C 在线?
就是个winform程序,导数据用的,执行100次关闭一次
xuzuning 2016-04-08
  • 打赏
  • 举报
回复
又一次成功,就表示代码无大问题 数据库使用完之后要关闭 既然是 C/S,那么出问题时有多少 C 在线?
just59277 2016-04-08
  • 打赏
  • 举报
回复
把这些数据操作,写到数据库存储过程里面去,然后再优化数据库。
风灵灬 2016-04-08
  • 打赏
  • 举报
回复
winform下的,求解决办法,试了好多次,都是半小时左右就超时了

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧