sybase c# 数据量大 连接断开 解决

因为项目中有一个需求是 从以前的系统中的数据迁移到新的系统,我才接触到了这个sybase数据库  版本 sqlanywhere 5.5

一开始测试的时候用 c# odbc 连接了 数据库然后一并读出来存储到DataTable 。一开始正常运行 ,但是数据量超过1千或更多的话 他就报错 :::数据连接断开

测试了好久以后还是一样。找了好久以后找到了一个办法。sybase数据库中的分页功能  set rowcount 1000; 

然后根据这个分页读出来追加到 DataTable 然后再处理

代码如下

string dsn = "xx";
                string ConStr = "DSN=" + dsn + ";UID=dba;PWD=sql;Max Pool Size = 4096;Pooling=False; Connect Timeout=6000;";
                //定义SqlConnection对象实例
                int limit = 500;//数据量
                string SqlStr = "select * from t_customer;";
                string start="0";//连接断开后再次运行的时候定义的开始id
                SqlStr = "select count(*) as ct from t_customer where c_id > "+start+";";

                OdbcConnection con = new OdbcConnection(ConStr);
                con.ConnectionTimeout = 60 * 60 * 2;
                OdbcCommand cmd = new OdbcCommand(SqlStr, con);
               
                OdbcDataAdapter odbcAdapter = new OdbcDataAdapter(cmd);

                DataTable tables = new DataTable();
                con.Open();
                odbcAdapter.Fill(tables);

                string ct_str = tables.Rows[0]["ct"].ToString();
                int rows = int.Parse(ct_str);


                SqlStr = "set rowcount " + limit + ";select * from t_customer  where c_id > " + start + " order by c_id asc";

                cmd = new OdbcCommand(SqlStr, con);

 odbcAdapter = new OdbcDataAdapter(cmd);
                Log.info(SqlStr);
                tables.Columns.Clear();
                tables.Rows.Clear();
                odbcAdapter.Fill(tables);
                con.Close();
                string row_str = "";
                string cols = "";

                string last_cid = "";//本次读取的数据的最后一个id
                int rs = tables.Rows.Count;

                 for (var j = 0; j < rs; j++)
                {
                   
                    
                    //这里写追加到DataTable的代码    
                    
                    last_cid = tables.Rows[j]["c_id"].ToString();

                }
    
                int index = limit;
                int round = rows / limit + 1;


                for (var k = 1; k < round; k++)
                {

                    try
                    {
                       con.Open();
                    }
                    catch
                    {

                    }
                    SqlStr = "set rowcount " + limit + "; select  * from t_customer  where c_id > " + last_cid + " order by c_id asc ;";

                    cmd = new OdbcCommand(SqlStr, con);
                    cmd.CommandTimeout = 60 * 60 * 2;
                    odbcAdapter = new OdbcDataAdapter(cmd);
                    DataTable dt = new DataTable();

                try
                {
                    odbcAdapter.Fill(dt);
                }
                catch
                {
//这里非常重要  功能是连接断开后 自动退一步然后再开启连接重新开始
                    con.Close();
                    k--;
                    continue;

                }

                for (var j = 0; j < dt.Rows.Count; j++)
                    {
                       //读出来的数据追加到 DataTable


                        last_cid = dt.Rows[j]["c_id"].ToString();

                        index++;

                        Console.WriteLine("第:" + index);
                
                    }
                    try
                    {
                       con.Close();
                    }
                    catch
                    {

                    }
                  }

读取的代码改成这样后,连接断开了可以自动连接然后再次继续运行了。看看吧,应该对某些人有用吧。是因为没有找到搜索到解决方案 我才自己动手解决的这个问题。希望帮助到一些对这方面右需求的 程序猿

上一篇:284. Peeking Iterator


下一篇:TCP/UDP协议