使用 ExecuteList 时遇到这样一个问题:

Jun 7, 2010 at 8:47 AM
Edited Jun 7, 2010 at 8:54 AM

环境:vs.net2008 +mysql;

下面代码运行正常,可以取到数据:

            Lephone.Data.SqlEntry.SqlStatement SqlStatement = new Lephone.Data.SqlEntry.SqlStatement(System.Data.CommandType.StoredProcedure, "sp_GetPisoimPoint", "10.11.1.116");
            var db = Lephone.Data.DbEntry.Context.ExecuteDataset(SqlStatement);

下面代码运行出现异常:(如果把"10.11.1.116" 改成"1"就可以正常运行

            Lephone.Data.SqlEntry.SqlStatement SqlStatement = new Lephone.Data.SqlEntry.SqlStatement(System.Data.CommandType.StoredProcedure, "sp_GetPisoimPoint", "10.11.1.116");
            var db = Lephone.Data.DbEntry.Context.ExecuteList<pisoim_point>(SqlStatement);
异常提示:
未处理 System.InvalidCastException
  Message="指定的转换无效。"
  Source="DbEntry_MemoryAssembly"
  StackTrace:
       在 $1.LoadSimpleValuesByName(Object , IDataReader )
       在 Lephone.Data.Common.EmitObjectHandlerBase.LoadSimpleValues(Object o, Boolean useIndex, IDataReader dr)
       在 Lephone.Data.Common.ObjectInfo.CreateObject(Type dbObjectType, IDataReader dr, Boolean useIndex)
       在 Lephone.Data.DbContext.<>c__DisplayClass24.<DataLoadDirect>b__23(IDataReader dr)
 。。。。。。。。
       在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()
  InnerException:
 
sp_GetPisoimPoint 的代码:
BEGIN
	set @querysql = "select * from pisoim_point";
	if(pointips<>"") then
		set @querysql = concat(@querysql ," where ip in ('", replace(pointips,",","','") ,"') ");
	end if;
	prepare  stmt from @querysql;
	execute stmt;
END
  
不知道是不是一个bug,如何调用存储过程后返回指定类型的集合?
 
Coordinator
Jun 7, 2010 at 9:21 AM
LoadSimpleValuesByName时出现InvalidCastException,说明你在存储过程中返回的某种类型,和你在Model里设置的同名变量的类型不匹配。
有时候,数据库的 .net provider 有bug的时候,会造成这种问题。
这种情况,可以尝试以下方法:
  • 把配置文件中的ObjectHandlerType改成Reflection(或添加此项),则使用反射,速度略慢
  • 使用ExecuteDataset,无法使用Model
  • 修改Model,使类型匹配。如果是数据库 .net provider 的 bug,可能无法使orm、直接sql、存储过程都正确。
Jun 7, 2010 at 9:32 AM

明白了,谢谢你的及时回复。