由于项目的开发需要支持Sybase和Sql Server 2000,所以打算使用Odbc来连接Sybase和Sql Server 2000。
在使用的过程中发现了几个问题
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%了,狂赞!!