这两天写动作识别代码,需要用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语句