使用DAAB 3.1连接Sybase ASE 11.9.2数据库的两个问题(原创)
2006-06-19 11:11
645 查看
由于项目的开发需要支持Sybase和Sql Server 2000,所以打算使用Odbc来连接Sybase和Sql Server 2000。
在使用的过程中发现了几个问题
1、Sybase的连接字符串可以写成
但是Sql Server中这样写会报"没有提供任何 DSN 或SERVER 关键字"。此时把Srvr改为Server,问题解决。
2、好像参数为param object[]的在Sybase ASE 11.9.2中无法使用
举个例子
Odbc的ExecuteScalar(System.Data.IDbConnection conn,string spName,param object[] parameterValues);
如果连接Sql Server 2000, 我们可以这样写
测试通过!!
但是如果连接Sybase,这样写
会报Parameter count does not match Parameter Value count. 错误
可能有的读者认为Odbc的连接需要用?来标示存储过程的个数,如"{call SalesByCategory (?,?)}",这是正确的,但是DAAB已经考虑了这种情况,对于只提供了存储过程名的自动在后面将上和参数数量相等的?,看看有关的代码
// If there's only a stored procedure name
StringBuilder par = new StringBuilder();
if( command.Parameters.Count != 0 )
{
bool isFirst = true;
bool hasParameters = false;
for( int i = 0; i < command.Parameters.Count; i++ )
{
OdbcParameter p = command.Parameters[i] as OdbcParameter;
if( p.Direction != ParameterDirection.ReturnValue )
{
if( isFirst )
{
isFirst = false;
par.Append( "(?" );
}
else
{
par.Append( ",?" );
}
hasParameters = true;
}
else
{
call = " ? = call ";
}
}
if (hasParameters)
{
par.Append( ")" );
}
}
command.CommandText = "{" + call + command.CommandText + par.ToString() + " }";
再回到Parameter count does not match Parameter Value count的错误通过测试,发现问题出在DAAB的Odbc类覆写(Override)DeriveParameters( IDbCommand cmd )方法,而这个方法调用OdbcCommandBuilder.DeriveParameters( (OdbcCommand)cmd )出现了问题。这里使用了ADO.NET的DeriveParameters方法在Sybase ASE 11.9.2并没有对command的参数进行赋值,而Sql Server 2000可以正确的传值.
因此我们不得不采用另一种方法
使用OdbcParameter[]的写法对于Sybase ASE 11.9.2和Sql Server 2000都调试通过.
P.S. 最近练了一个足球技巧,左脚将球拨到右脚,球碰右脚尖弹起至身体右外侧,同时左脚绕到身体的右外侧将球颠起.现在10个能做起2个左右,还要再熟练一下.感觉现在的身体已经恢复到本科时候的60%了,狂赞!!
在使用的过程中发现了几个问题
1、Sybase的连接字符串可以写成
Driver={SYBASE SYSTEM 11};Srvr=basil;Database=XTERPCURBS;Uid=sa;pwd=
但是Sql Server中这样写会报"没有提供任何 DSN 或SERVER 关键字"。此时把Srvr改为Server,问题解决。
Driver={SQL Server};Server=basil;Database=test;Trusted_Connection=yes;Uid=sa;pwd=
注:通过进一步测试,发现Sql Server 2000只能使用Server,而Sybase ASE 11.9.2只能使用Srvr
2、好像参数为param object[]的在Sybase ASE 11.9.2中无法使用
举个例子
Odbc的ExecuteScalar(System.Data.IDbConnection conn,string spName,param object[] parameterValues);
如果连接Sql Server 2000, 我们可以这样写
GDN.Odbc odbc=new GotDotNet.ApplicationBlocks.Data.Odbc(); string connstr="Driver={SQL Server};
Server=basil;Database=test;Trusted_Connection=yes;Uid=sa;pwd="; OdbcConnection conn=new OdbcConnection(connstr); object o=odbc.ExecuteScalar(conn,"SalesByCategory","Seafood","1998");
测试通过!!
但是如果连接Sybase,这样写
GDN.Odbc odbc=new GotDotNet.ApplicationBlocks.Data.Odbc(); string connstr="Driver={SYBASE SYSTEM 11};Srvr=basil;Uid=sa;Pwd=;DB=AddressBook"; OdbcConnection conn=new OdbcConnection(connstr); object o=odbc.ExecuteScalar(conn,"authors_select1","hahah","ssss");
会报Parameter count does not match Parameter Value count. 错误
可能有的读者认为Odbc的连接需要用?来标示存储过程的个数,如"{call SalesByCategory (?,?)}",这是正确的,但是DAAB已经考虑了这种情况,对于只提供了存储过程名的自动在后面将上和参数数量相等的?,看看有关的代码
// If there's only a stored procedure name
StringBuilder par = new StringBuilder();
if( command.Parameters.Count != 0 )
{
bool isFirst = true;
bool hasParameters = false;
for( int i = 0; i < command.Parameters.Count; i++ )
{
OdbcParameter p = command.Parameters[i] as OdbcParameter;
if( p.Direction != ParameterDirection.ReturnValue )
{
if( isFirst )
{
isFirst = false;
par.Append( "(?" );
}
else
{
par.Append( ",?" );
}
hasParameters = true;
}
else
{
call = " ? = call ";
}
}
if (hasParameters)
{
par.Append( ")" );
}
}
command.CommandText = "{" + call + command.CommandText + par.ToString() + " }";
再回到Parameter count does not match Parameter Value count的错误通过测试,发现问题出在DAAB的Odbc类覆写(Override)DeriveParameters( IDbCommand cmd )方法,而这个方法调用OdbcCommandBuilder.DeriveParameters( (OdbcCommand)cmd )出现了问题。这里使用了ADO.NET的DeriveParameters方法在Sybase ASE 11.9.2并没有对command的参数进行赋值,而Sql Server 2000可以正确的传值.
因此我们不得不采用另一种方法
GDN.Odbc odbc=new GotDotNet.ApplicationBlocks.Data.Odbc(); string connstr="Driver={SYBASE SYSTEM 11};Server=basil;Uid=sa;Pwd=;DB=AddressBook"; OdbcParameter [] searchParms = new OdbcParameter[1]; searchParms[0] = new OdbcParameter("@bh",OdbcType.VarChar); searchParms[0].Value = "0000000002"; object o=odbc.ExecuteScalar(connstr,"getMaxYsqlBxMxID",searchParms);
使用OdbcParameter[]的写法对于Sybase ASE 11.9.2和Sql Server 2000都调试通过.
P.S. 最近练了一个足球技巧,左脚将球拨到右脚,球碰右脚尖弹起至身体右外侧,同时左脚绕到身体的右外侧将球颠起.现在10个能做起2个左右,还要再熟练一下.感觉现在的身体已经恢复到本科时候的60%了,狂赞!!
相关文章推荐
- 使用DAAB3.1连接多种数据库(SqlServer,OleDB,ODBC)(原创)
- 初次使用WebPartManange出现数据库连接出错的问题
- VS2012 使用MySql的API函数连接数据库(成功), 以及使用mysql-connector-c++-1.1.3遇到的问题!
- 使用Hibernate + MYSQL数据库问题(Hibernate连接数据库超时设置autoReconnect=true)
- 解决SQL Server 2008 不能使用 “.” local本地连接数据库问题
- 第16周周五:数据库连接与随机数的使用 问题
- 使用PLSQL Developer连接数据库的问题解决方案
- VC 使用ADO连接数据库的问题!error C2059: 语法错误 : “”
- 使用 JDBC 连接不同版本 DB2 数据库的兼容性问题
- WebSphere使用数据源连接数据库的事务问题
- navcat连接数据库Mysql使用密码问题
- ovs2.7 在系统重启后,再次使用时提示数据库无法连接的问题。
- WINCC中使用ADO对象连接数据库 例子 常用属性 方法 原创
- 用特殊符号连接orcal数据库中取出的两个字段(使用“||”)
- [原创]谈谈vb中使用数据库的一点小问题
- Oracle11gR2 RAC 使用scan IP无法连接数据库(ORA-12545)问题解决
- 关于在使用c3p0 连接池配置数据库连接时出现 com.mchange.v2.resourcepool.CannotAcquireResourceExceptiond问题的解答
- 【数据库】使用ADO方法连接数据库的OPEN方法的字符串问题
- asp中遇到的几个问题——数据库连接,几个常见控件的使用问题及其解决
- 使用pyMySQL连接数据库时遇到的几个问题