因为项目中有一个需求是 从以前的系统中的数据迁移到新的系统,我才接触到了这个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
{
}
}
读取的代码改成这样后,连接断开了可以自动连接然后再次继续运行了。看看吧,应该对某些人有用吧。是因为没有找到搜索到解决方案 我才自己动手解决的这个问题。希望帮助到一些对这方面右需求的 程序猿