Unity3D中写入SQL数据库抛出InvalidProgramException解决过程

这两天写动作识别代码,需要用unity连接SQL数据库。我在使用AddWithValue方法写入数据的时候,unity抛出了InvalidProgramException异常。具体信息如下:

出现这个问题时, 我使用的是windows身份验证方式连接SQL数据库,并且在工程中引用的是来自C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Unity Subset v3.5目录下的System.Data.dll类库文件(每个人的具体路径可能不同,Reference Assemblies开始应该是一样的)。


怀疑是类库文件版本的问题,后来问题这样解决:

我改用D:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\unity目录底下的(每个人的具体路径可能不同,找起来不难)System.Data.dll,运行的时候在连接数据库的时候提示不能用Windows身份验证方式登录数据库。我便又修改来数据库的身份验证方式为SQL身份验证方式,问题便顺利解决了。(因为仅仅是用于记录学习数据的本地数据库,所以修改登陆方式也没啥顾虑)。


总结一下应该是程序集版本不兼容造成的。在Unity的Project Setting->Player中,看到API兼容性选项如下图:


这应该标明了支持的程序集的版本。

另外用反汇编工具ildasm查看了我之前使用的两个不同的类库文件get_Parameters()的IL代码得到了如下的结果:

subset v3.5:

.method public hidebysig specialname instance class System.Data.SqlClient.SqlParameterCollection 
        get_Parameters() cil managed
{
  // 代码大小       1 (0x1)
  .maxstack  8
  IL_0000:  ret
} // end of method SqlCommand::get_Parameters

mono目录下的:

.method public hidebysig specialname instance class System.Data.SqlClient.SqlParameterCollection 
        get_Parameters() cil managed
{
  // 代码大小       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class System.Data.SqlClient.SqlParameterCollection System.Data.SqlClient.SqlCommand::parameters
  IL_0006:  ret
} // end of method SqlCommand::get_Parameters

可以看到两者之间的差别,而异常所指向的便是subset v3.5版本中IL_0000: ret语句

你可能感兴趣的:(.NET编程,unity,磕磕绊绊)