c#连接sybase数据库的方法,以及乱码处理
·
最近有个很老的项目要处理,发现数据库是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,发现没问题,具体是不是完全正确就纠结了,能用就行。
至此,数据可正确读出,剩下就是按照原有结构在新的数据库服务器上建立一个表,写入即可。
留底备查。
更多推荐


所有评论(0)