我自己写了一个根据oracle表结构生成实体类的组件,
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ assembly name="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll" #> <#@ import namespace="System.Data" #> <#@ assembly name="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.OracleClient.dll" #> <#@ import namespace="System.Data.OracleClient" #> <#@ assembly name="$(ProjectDir)bin\Debug\Tongl.CodeBuilder.Oracle.dll" #> <#@ output extension=".cs" encoding="utf-8" #> <#=Tongl.CodeBuilder.Oracle.Builder.DoEntity("oracle连接字符串", "命名空间") #>
但是我直接在控制台里调用
static void Main(string[] args) { Tongl.CodeBuilder.Oracle.Builder.DoEntity("连接字符串", "Tongl.CodeBuilder.Oracle.CmdTest"); Console.WriteLine("-------- end -----------"); Console.ReadKey(); }
是没有问题的,生成什么的都是正常的,可是移植到T4模板中时就出现以下错误:
错误 3 正在运行转换: System.Data.OracleClient.OracleException (0x80131938): ORA-06413: 连接未打开 在 Tongl.CodeBuilder.Oracle.Builder.DoEntity(String connString, String nameSpace) 位置 d:\Code\CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle\Builder.cs:行号 88 在 Microsoft.VisualStudio.TextTemplatingCFB9FF8BC445F261B2A9A7BF0ABF9B797E7F2C638BBB8D010DBFCC7172512A5E44796AB7B648C21F67B2E980DF86A7B866E7A61A44A7D3EE9F143A932C847C4A.GeneratedTextTransformation.TransformText() 位置 d:\Code\CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle.CmdTest\Code.tt:行号 14 d:\Code\CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle\Tongl.CodeBuilder.Oracle\Builder.cs 88 1 Tongl.CodeBuilder.Oracle
断点检测是
Tongl.CodeBuilder.Oracle.Builder.cs文件中出错
using (var conn = new OracleConnection(“连接字符串”)) { conn.Open();
conn.Open();这句话是出现的错误
那么问题来了,T4模板背后是什么情况导致调用自己编写的组件(该组件需要读取oracle表结构)是出问题,而直接在控制台中调用就完全没有问题的?
肯定是你方法错了.
推荐ServiceStack.OrmLite 项目,github上项目里有一个t4模版,用来生成实体类,支持各种数据库
可是该方法在控制台中调用就是没问题的,为什么到了T4模板中就不行了那
@那一年的码农: 友情提示.t4模版是可以调试的.
@吴瑞祥: 我就是调试的时候才发现每次到conn.Open();这行代码就报错,但是为嘛控制台中就是没问题的那
@那一年的码农: 有错误提示了.直接解决错误不就好了
@吴瑞祥: /(ㄒoㄒ)/~~ 就是不知道代码在控制台里好好的 怎么跑到T4模板中就不行了呐~~~
“移植到T4模板中” ——〉 是同一台机器?同一个连接字符串?都是 x64 或 x86 进程?
我有写了一个demo,单步调试,还是报【连接未打开】
不知道为什么,代码复制不过去。。。。
@那一年的码农: 同一台机器,同样的代码,但是写在T4模板就是会报错,cmd中就没问题,可以运行,可以读出表内容
@那一年的码农: 都是 x64 或 x86 进程?
@Launcher: 额这个t4模板的运行还能够设置 x64 或 x86 进程吗?T4模板只要修改后以保存就会执行嘛,而且还有一点如果我的链接字符串是这样的Data Source=xx;User Id=x;Password=xxx; 那报的错误是ORA-12154;TNS:无法处理服务名,如果连接字符串是这样的:Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.1)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = www.google.com)));User Id=x;Password=xxx;那报的错误是ORA-06413: 连接未打开,我在深度的怀疑,T4模板的运行环境跟本机的环境是不一致的,只是T4模板运行时看不到我本机配置的服务名,只能用Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.1)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = www.google.com)));User Id=x;Password=xxx;这种方式的连接字符串
@那一年的码农: 你的 Oracle 客户端组件安装的是 x64 还是 x86 ?
打开“任务管理器”,运行你的 cmd 程序,如果 cmd 程序的进程名后跟有 *32 ,那么这就是 32 进程;在 T4 模板的代码中设置断点,然后观察进程列表中跟 VS 相关的进程名(devenv.exe,MSBuild.exe)后是否跟有 *32。
PS:目前 VS 应该没有 64 位的。
@Launcher: 看过了 都有*32,应该都是32位的,亲有没有条件根据截的图操作一下,真的很怪呀
@那一年的码农: 把你的 cmd 程序的目标平台修改为 x64,测试是否还能正确运行。
@Launcher: 改过了 没问题可以访问数据库,就是T4模板的运行可能是有限制的
@那一年的码农: 你是说你在你的机器上同时安装了 Oracle Client 的 x86 和 x64 版本?
@Launcher: 额 我用的是微软自带的System.Data.OracleClient呀,不安装oracle client应该也是没问题的
@那一年的码农: “额 我用的是微软自带的System.Data.OracleClient呀,不安装oracle client应该也是没问题的” -〉 你最好把这个作为一个博问的新问题发个帖,你看看大家怎么回答你?
哎,太操蛋了,竟然是oracle client版本不对,,,,,无语中
我也有这个问题,无法解决,什么Client版本不对。我使用的是微软自带的都是4.0