最近有个很老的项目要处理,发现数据库是sybase,版本未知(肯定是07年以前的版本)。需求简单,只需要导出特定几张表的数据即可。

尝试了几个数据库管理软件均告失败(数据库版本过老,多数需要在服务器上执行一些sql之后才能连接,为了安全放弃这种做法),决定用程序独处数据后写入新数据库的笨办法来解决。

开发机安装sybase数据库,之后ODBC源可以创建新的dsn对数据库进行连接,填写地址用户名密码之类的东西后,测试连接,显示通过!ok,那么下一步就是把数据搞出来。

连接字符串:

 OdbcConnection conn = new OdbcConnection();
 conn.ConnectionString =
                          "Dsn=xxxxx;" +
                          "Uid=sa;" +
                          "Pwd=xxxxxxxx;";
conn.Open();

不报错,ok,command和reader安排上

OdbcCommand ocmd = new OdbcCommand();
ocmd.CommandText = "set RowCount 10 select * from table1";
ocmd.Connection = conn;
OdbcDataReader rd = ocmd.ExecuteReader();
int i=0;
string s="";
while (rd.Read())
    {
     i = 0;
     s = "";
     TbResult.Text = "";
     while (i < rd.FieldCount)
         {
          s += rd[i++].ToString() + "|";
         }
     s = s.Substring(0, s.Length - 1)+"\r\n";
     TbResult.Text += s;
    }

结果报错,提示找不到表!想了下,估计是库的指定有问题导致没有找到表?尝试sql里写 from DBName.table1、DBName_table1,都报错过不去。

换思路,use一下行不行?

 OdbcConnection conn = new OdbcConnection();
 conn.ConnectionString =
                          "Dsn=xxxxx;" +
                          "Uid=sa;" +
                          "Pwd=xxxxxxxx;";
conn.Open();
OdbcCommand ocmd = new OdbcCommand();
ocmd.CommandText = "use DBName";
ocmd.Connection = conn;
int i=ocmd.ExecuteNonQuery();
MessageBox.Show(i.ToString());

OK,过了,没报错,

再次尝试读表,OK,数据出来了,Nice!

等等,为什么中文全部是乱码?baidu之,说是因为字符集设定不同导致的,按照服务器端设定DSN里的参数,再次尝试,还是乱码!怎么办?

继续笨办法,接着转码

private string getValue(string str)        
    {
     string s = System.Text.Encoding.GetEncoding("gbK").GetString(System.Text.Encoding.GetEncoding("iso8859-1").GetBytes(str));
     return s;
    }

GetEncoding("iso8859-1")这里是服务器端编码,里边可以自己改。这个数据库设计者当年用的iso_1,直接写进去发现参数错误,又是度娘了下找到这个iso8859-1,发现没问题,具体是不是完全正确就纠结了,能用就行。

至此,数据可正确读出,剩下就是按照原有结构在新的数据库服务器上建立一个表,写入即可。

留底备查。

更多推荐