1. 本次服务器迁移主要目的:
医院为整合各系统,方面统一部署和管理。
2. 本次服务器迁移所遇到的问题:
a. 跟原先的一台服务器上部署数据库和IIS相比,现改为3台服务器来管理,1号服务器部署WebService作为主要的服务器,2号服务器部署WebService作为备用服务器,用来应对当主服务器挂掉时,能及时切到备用服务器上进行处理,3号服务器部署SQL Server数据库。
b. HIS数据库采用SyBase数据库,连接方式并不是直连。在旧服务器上,采用OLEDB进行连通,可以看做是一组读写数据的方法。在新服务器上,采用ODBC进行连通。由于连接方式不同,项目代码不一定存在两种方式都有的连通方式。因此需要比对源代码。
3.何为OLEDB?何为ODBC?
OLEDB,可以理解为通向不同数据源的一个应用程序接口,为一种读写数据的方法。被设计为ODBC的一种高级替代者和继承者。OLEDB的提供者可以用于提供像文本文件和电子表格一样简单的数据存储访问,也可以提供像Oracle,SQL Server,Sybase ASE一样复杂的数据库的访问。
ODBC,提供了一种标准的API方法来访问数据库。这些API利用SQL来完成其大部分任务。ODBC本身也提供了SQL语言的支持,可以直接使用SQL语句。
4. 本次搬迁服务器主要内容和步骤:
1. 准备工作:在代码全部修改完并测试完成以后,开始做具体的搬迁准备。首先在1号服务器和2号服务器IIS上部署WebService,具体过程略。注意门诊输液系统本地的连接字符串为如下方式(172.18.128.159为3号服务器部署数据库的):
server=172.18.128.159;database=mzsy_enjoyor;uid=sa;password=sa;providerName=System.Data.SqlClient
172.18.128.159为3号服务器本地数据库名。
2. 安装配置ODBC,具体安装版本需要询问信息科,或者直接去网上下载。安装完成之后,打开“控制面板——管理工具——数据源(ODBC)”
选择在“数据源(ODBC)”中选择“系统DSN”,点击“添加”:
选择对应的数据库驱动程序,如果是Sybase数据库驱动程序选择“Adaptive ServerEnterprise”,当前以SQL Server为例
数据源名称(DataSource Name):写上新的ODBC的数据源名称,如:mzsy
描述(Description):
服务器:输入对应的服务器名称。如果不是本机,填上对应的IP地址和端口号。
“下一步”
使用用户输入登录ID和密码的SQL Server验证。输入登录ID和密码,“下一步”。
这里直接点击“下一步”,或可以更改默认的数据库:
点击“完成”:
点击“测试数据源进行连通性测试”,点击“确定”:
门诊输液服务端配置文档连接字符串:
Provider=Adaptive Server Enterprise;Data Source=172.18.128.121,5000;dsn=mzsy;uid=sa;pwd=sa;initial catalog=mzsy_enjoyor
Provider 可以理解为ODBC的数据源要连接的数据库的驱动程序sybase为AdaptiveServer Enterprise,SQL Server为SQL Server等。
initial catalog为要连接的数据库名字。
5.在实施过程当中可能会碰到的问题:
1. 如果出现“[Sybase][ODBCDriver][Adaptive Server Enterprise]Language name in login record 'chinese' isnot an official name on this ASE. Using default 'us_english' for syslogins instead.”问题时。
解决办法是在“高级”选项的“语言”项,填入:us_english即可。
2. 如果出现:“ERROR[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序。”
解决办法:没有设置数据源,在DataSource Name 写入数据源名称 或者在连接字符串当中加入dsn=… 如:dsn=sybasenew
3. 如果出现:“未在本地计算机上注册“{sybase ase odbc driver}”提供程序。”则判断需要连接的数据库是什么,如果是SQL Server 则将连接字符串Driver={sybase ase odbc driver}改成Driver={SQL Server};如果是SyBase 则改成Provider=Adaptive Server Enterprise;
4. 如果出现:“未指定OLEDB提供程序。示例为“Provider=SQLOLEDB””的错误时。同上将Provider改成对应的驱动程序。
5. 重点来啦,如果出现:“ERROR[ZZZZZ]过程期望参数@MZH但未提供”错误。请在代码中查询:具体ODBC连接代码如下(注:先给出连接代码,并非该存储过程代码):
using System.Data.Odbc;
OdbcConnectionConn = new OdbcConnection(this.m_hisconnstr);//this.m_hisconnstr为连接字符串
OdbcDataAdapterAdapter = new OdbcDataAdapter(sql, Conn);//sql要执行的SQL语句
DataSetSet = new DataSet();
Adapter.Fill(Set);
DataTabledataTable = new DataTable();
if(Set.Tables.Count > 0)
{
dataTable= Set.Tables[0];
}
returndataTable
对于上述的错误调用存储过程的代码如下:
OdbcConnection Conn = newOdbcConnection(this.m_hisconnstr);
OdbcCommand odbcCommand = newOdbcCommand("{call MZSY_病人对应门诊号 (?)}", Conn); //这一行是错误原因,请见下文分析
if (id.Length > 15)
{
id= id.Substring(0, 10);
}
odbcCommand.Parameters.Add(newOdbcParameter("@MZH", OdbcType.VarChar));
odbcCommand.Parameters[0].Direction= ParameterDirection.Input;
odbcCommand.Parameters[0].Value =id;
odbcCommand.CommandType =CommandType.StoredProcedure;
OdbcDataAdapter Adapter = newOdbcDataAdapter(odbcCommand);
DataTable tempTable = newDataTable();
Adapter.Fill(tempTable);
if (tempTable.Rows.Count > 0)
{
id= tempTable.Rows[0][0].ToString();
}
else
{
id= "不存在++"; //由于门诊号不可能是【不存在++】 所以此处赋该值,以防没有记录时取到其他人的信息
thrownew Exception(test_id_type + " " + id + " " +"tempTable=0");
}
报该错误的原因在于这一行代码(这已经是正确代码,下面给出错误代码):
OdbcCommandodbcCommand = new OdbcCommand("{call MZSY_病人对应门诊号 (?)}", Conn);
这行代码原先的写法(错误代码):
OdbcCommand odbcCommand =new OdbcCommand("MZSY_病人对应门诊号", Conn);
“MZSY_病人对应门诊号”为存储过程名字。但是在ODBC执行当中不能这样写,必须写:“{call MZSY_病人对应门诊号(?)}”。
6. 如果出现:“万维网发布服务(w3svc)以停止。除非万维网发布服务(w3svc)正在运行,否则无法启动网站”
这个原因出现的很悲催,不知道是谁将IIS停掉了。解决办法:在IIS里:在左边栏里 找到你的计算机名字("应用程序池""FTP站点""网站"的最上面哪个) 右键点击-启动----OK---你现在 再启动"网站"