首页 新闻 会员 周边

为什么T4模板没办法自动生成oracle表结构?ORA-06413连接未开打

0
悬赏园豆:30 [已关闭问题] 关闭于 2015-07-16 16:48

我自己写了一个根据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表结构)是出问题,而直接在控制台中调用就完全没有问题的?

问题补充:

以及怎么解决T4模板中oracle连接无法打开的问题

tongling的主页 tongling | 初学一级 | 园豆:30
提问于:2015-07-15 12:18
< >
分享
所有回答(4)
0

肯定是你方法错了.

推荐ServiceStack.OrmLite 项目,github上项目里有一个t4模版,用来生成实体类,支持各种数据库

吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-15 12:22

可是该方法在控制台中调用就是没问题的,为什么到了T4模板中就不行了那

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 12:54

@那一年的码农: 友情提示.t4模版是可以调试的.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-15 12:55

@吴瑞祥: 我就是调试的时候才发现每次到conn.Open();这行代码就报错,但是为嘛控制台中就是没问题的那

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 12:59

@那一年的码农: 有错误提示了.直接解决错误不就好了

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-15 14:07

@吴瑞祥: /(ㄒoㄒ)/~~   就是不知道代码在控制台里好好的 怎么跑到T4模板中就不行了呐~~~

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 14:09
0

“移植到T4模板中” ——〉 是同一台机器?同一个连接字符串?都是 x64 或 x86 进程?

Launcher | 园豆:45045 (高人七级) | 2015-07-15 13:50

我有写了一个demo,单步调试,还是报【连接未打开】

 

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 14:14

不知道为什么,代码复制不过去。。。。

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 14:17

@那一年的码农: 同一台机器,同样的代码,但是写在T4模板就是会报错,cmd中就没问题,可以运行,可以读出表内容

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 14:18

@那一年的码农: 都是 x64 或 x86 进程?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-15 14:23

@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;这种方式的连接字符串

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 14:30

@那一年的码农: 你的 Oracle 客户端组件安装的是 x64 还是 x86 ?

打开“任务管理器”,运行你的 cmd 程序,如果 cmd 程序的进程名后跟有 *32 ,那么这就是 32 进程;在 T4 模板的代码中设置断点,然后观察进程列表中跟 VS 相关的进程名(devenv.exe,MSBuild.exe)后是否跟有 *32。

PS:目前 VS 应该没有 64 位的。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-15 14:48

@Launcher: 看过了 都有*32,应该都是32位的,亲有没有条件根据截的图操作一下,真的很怪呀

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 15:18

@那一年的码农: 把你的 cmd 程序的目标平台修改为 x64,测试是否还能正确运行。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-15 15:49

@Launcher: 改过了 没问题可以访问数据库,就是T4模板的运行可能是有限制的

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 15:52

@那一年的码农: 你是说你在你的机器上同时安装了 Oracle Client 的 x86 和 x64 版本?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-15 15:57

@Launcher: 额 我用的是微软自带的System.Data.OracleClient呀,不安装oracle client应该也是没问题的

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2015-07-15 15:59

@那一年的码农: “额 我用的是微软自带的System.Data.OracleClient呀,不安装oracle client应该也是没问题的” -〉 你最好把这个作为一个博问的新问题发个帖,你看看大家怎么回答你?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-07-15 16:02
0

哎,太操蛋了,竟然是oracle client版本不对,,,,,无语中

tongling | 园豆:30 (初学一级) | 2015-07-16 16:48
0

我也有这个问题,无法解决,什么Client版本不对。我使用的是微软自带的都是4.0

tommy007 | 园豆:139 (初学一级) | 2015-08-19 17:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册