Sybase Ase ADO.NET输出参数
时间:2011-06-09
来源:互联网
Sybase Ase ADO.NET输出参数
不知道这里有多少人用Sybase做数据库开发的,我是有点受不了了。用了Sybase ASE ADO.NET,冲破重重阻力,终于系统算是正常运行了,要做更进一步的处理:增加数据权限。我们原来是在Sql Server上用函数直接返回的结果集来判断的,但是Sybase不支持函数,只好用存储过程返回一个判断权限的条件字符串动态执行。问题是取出输出参数总提提示“Command has been closed”。奇怪啊,明明执行的时候是Open了Connection了。写了一个测试程序:
AseConnection con = new AseConnection("Data Source='SYBASE'; Port=5000; UID='sa'; PWD=''; Database='data';Connection Timeout='300';") ;
AseCommand com = new AseCommand("GetDataRightSQL", con) ;
com.CommandType = System.Data.CommandType.StoredProcedure ;
try
{
AseParameter prm = new AseParameter("@UserID", 1) ;
// prm.Direction = System.Data.ParameterDirection.Input ;
com.Parameters.Add(prm) ;
prm = new AseParameter("@Category","Department") ;
com.Parameters.Add(prm) ;
com.Parameters.Add(new AseParameter("@FieldName", "Dept_ID")) ;
prm = new AseParameter("@returnSql", AseDbType.VarChar, 250) ;
prm.Direction = System.Data.ParameterDirection.Output ;
com.Parameters.Add(prm) ;
con.Open() ;
com.ExecuteNonQuery() ;
Console.WriteLine(com.Parameters["@returnSql"].Value) ;
}
finally
{
if( con != null && con.State == System.Data.ConnectionState.Open )
con.Close() ;
}
return ;
FT,没有问题啊,返回的结果显示出来了,数据正确。
由于是我们有一个数据层专门处理数据库操作,开始怀疑封装的不好了。检查了N次也不知道在哪出错,总以为是输出参数类型有问题,试过几次,长度也改过。不行。
后来注意到:跟踪执行的时候执行成功,总是在取参数的时候出错。再看一下错误信息“Command has been closed”,晕!不会是取参数值的时候要求数据库连接保持Open状态吧?
修改一下测试代码:
AseConnection con = new AseConnection("Data Source='SYBASE'; Port=5000; UID='sa'; PWD=''; Database='data';Connection Timeout='300';") ;
AseCommand com = new AseCommand("GetDataRightSQL", con) ;
com.CommandType = System.Data.CommandType.StoredProcedure ;
try
{
AseParameter prm = new AseParameter("@UserID", 1) ;
// prm.Direction = System.Data.ParameterDirection.Input ;
com.Parameters.Add(prm) ;
prm = new AseParameter("@Category","Department") ;
com.Parameters.Add(prm) ;
com.Parameters.Add(new AseParameter("@FieldName", "Dept_ID")) ;
prm = new AseParameter("@returnSql", AseDbType.VarChar, 250) ;
prm.Direction = System.Data.ParameterDirection.Output ;
com.Parameters.Add(prm) ;
con.Open() ;
com.ExecuteNonQuery() ;
con.Close() ; //提前关闭数据库
Console.WriteLine(com.Parameters["@returnSql"].Value) ;
}
finally
{
if( con != null && con.State == System.Data.ConnectionState.Open )
con.Close() ;
}
return ;
哈哈,果真出错了。
原来在Sql Server及Oracle上操作时,执行完成后直接把连接关闭了。返回的参数想怎么处理就怎么处理,并不会出错。但是没有想到在Sybase ASE ADO.NET中竟然要求操作AseCommand的Parameters时要求数据库操持连接。
不知道这里有多少人用Sybase做数据库开发的,我是有点受不了了。用了Sybase ASE ADO.NET,冲破重重阻力,终于系统算是正常运行了,要做更进一步的处理:增加数据权限。我们原来是在Sql Server上用函数直接返回的结果集来判断的,但是Sybase不支持函数,只好用存储过程返回一个判断权限的条件字符串动态执行。问题是取出输出参数总提提示“Command has been closed”。奇怪啊,明明执行的时候是Open了Connection了。写了一个测试程序:
AseConnection con = new AseConnection("Data Source='SYBASE'; Port=5000; UID='sa'; PWD=''; Database='data';Connection Timeout='300';") ;
AseCommand com = new AseCommand("GetDataRightSQL", con) ;
com.CommandType = System.Data.CommandType.StoredProcedure ;
try
{
AseParameter prm = new AseParameter("@UserID", 1) ;
// prm.Direction = System.Data.ParameterDirection.Input ;
com.Parameters.Add(prm) ;
prm = new AseParameter("@Category","Department") ;
com.Parameters.Add(prm) ;
com.Parameters.Add(new AseParameter("@FieldName", "Dept_ID")) ;
prm = new AseParameter("@returnSql", AseDbType.VarChar, 250) ;
prm.Direction = System.Data.ParameterDirection.Output ;
com.Parameters.Add(prm) ;
con.Open() ;
com.ExecuteNonQuery() ;
Console.WriteLine(com.Parameters["@returnSql"].Value) ;
}
finally
{
if( con != null && con.State == System.Data.ConnectionState.Open )
con.Close() ;
}
return ;
FT,没有问题啊,返回的结果显示出来了,数据正确。
由于是我们有一个数据层专门处理数据库操作,开始怀疑封装的不好了。检查了N次也不知道在哪出错,总以为是输出参数类型有问题,试过几次,长度也改过。不行。
后来注意到:跟踪执行的时候执行成功,总是在取参数的时候出错。再看一下错误信息“Command has been closed”,晕!不会是取参数值的时候要求数据库连接保持Open状态吧?
修改一下测试代码:
AseConnection con = new AseConnection("Data Source='SYBASE'; Port=5000; UID='sa'; PWD=''; Database='data';Connection Timeout='300';") ;
AseCommand com = new AseCommand("GetDataRightSQL", con) ;
com.CommandType = System.Data.CommandType.StoredProcedure ;
try
{
AseParameter prm = new AseParameter("@UserID", 1) ;
// prm.Direction = System.Data.ParameterDirection.Input ;
com.Parameters.Add(prm) ;
prm = new AseParameter("@Category","Department") ;
com.Parameters.Add(prm) ;
com.Parameters.Add(new AseParameter("@FieldName", "Dept_ID")) ;
prm = new AseParameter("@returnSql", AseDbType.VarChar, 250) ;
prm.Direction = System.Data.ParameterDirection.Output ;
com.Parameters.Add(prm) ;
con.Open() ;
com.ExecuteNonQuery() ;
con.Close() ; //提前关闭数据库
Console.WriteLine(com.Parameters["@returnSql"].Value) ;
}
finally
{
if( con != null && con.State == System.Data.ConnectionState.Open )
con.Close() ;
}
return ;
哈哈,果真出错了。
原来在Sql Server及Oracle上操作时,执行完成后直接把连接关闭了。返回的参数想怎么处理就怎么处理,并不会出错。但是没有想到在Sybase ASE ADO.NET中竟然要求操作AseCommand的Parameters时要求数据库操持连接。
作者: cu_Cbear 发布时间: 2011-06-09
长短连接模式而已。
作者: Eisen 发布时间: 2011-06-10
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28