无法通过 T4 模板访问我的 SQL Server 2008 错误返回给我如何获取表?

Posted

技术标签:

【中文标题】无法通过 T4 模板访问我的 SQL Server 2008 错误返回给我如何获取表?【英文标题】:Cannot access my SQL Server 2008 by T4 template error is return to me how to get tables? 【发布时间】:2012-01-05 12:12:00 【问题描述】:

我想使用 T4 模板生成一些代码。我正在使用“sa”和 sa 的密码进行连接。但我无法连接到远程 SQL Server。我正在使用 SQL Server 2008。

错误如下:

错误运行转换:Microsoft.SqlServer.Management.Smo.FailedOperationException:SetParent 数据库“FlyAnt”失败。 ---> Microsoft.SqlServer.Management.Common.ConnectionFailureException: 无法连接到服务器 MROAPPSQL。 ---> System.Data.SqlClient.SqlException:用户登录失败 'MROTECHNIC\yusuf.karatoprak'. 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(布尔 征募OK) 在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,字符串 newPassword,布尔型 ignoreSniOpenTimeout, TimeoutTimer 超时,SqlConnection owningObject) 在 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo,字符串 newPassword,布尔重定向用户实例, SqlConnection owningObject、SqlConnectionString connectionOptions、 TimeoutTimer 超时) 在 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject,TimeoutTimer 超时,SqlConnectionString 连接选项、字符串 newPassword、布尔重定向用户实例) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份、SqlConnectionString 连接选项、对象 providerInfo、 字符串 newPassword、SqlConnection owningObject、布尔值 重定向用户实例) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,对象 poolGroupProviderInfo,DbConnectionPool 池, 数据库连接(拥有连接) 在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection、DbConnectionPool 池、DbConnectionOptions 选项) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection 拥有对象) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection 拥有连接) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection externalConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 在 Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect(WindowsIdentity 冒充身份) 在 Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() --- 内部异常堆栈跟踪结束 --- 在 Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() 在 Microsoft.SqlServer.Management.Common.ConnectionManager.PoolConnect() 在 Microsoft.SqlServer.Management.Common.ConnectionManager.get_ServerVersion() 在 Microsoft.SqlServer.Management.Smo.ExecutionManager.GetServerVersion() 在 Microsoft.SqlServer.Management.Smo.SqlSmoObject.get_ServerVersion() 在 Microsoft.SqlServer.Management.Smo.SqlSmoObject.ValidateParent(SqlSmoObject 新父母) 在 Microsoft.SqlServer.Management.Smo.SqlSmoObject.SetParentImpl(SqlSmoObject 新父母) --- 内部异常堆栈跟踪结束 --- 在 Microsoft.SqlServer.Management.Smo.SqlSmoObject.SetParentImpl(SqlSmoObject 新父母) 在 Microsoft.SqlServer.Management.Smo.Database..ctor(服务器服务器,字符串名称) 在 Microsoft.VisualStudio.TextTemplating3B02A40A7B5CFF5BC85C47D46E8EE44A.GeneratedTextTransformation.CodeGenerator.RunCore() 在 T4Toolbox.Generator.Run() 在 Microsoft.VisualStudio.TextTemplating3B02A40A7B5CFF5BC85C47D46E8EE44A.GeneratedTextTransformation.TransformText() 在 Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation(TemplateProcessingSession 会话,字符串源,ITextTemplatingEngineHost 主机,字符串& 结果)

我的代码是这样的:

<#@ template language="C#"#>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ assembly name="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.sfc, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Common" #>
<#@ assembly name="System.Xml"#>


<#@ import namespace="System.Reflection"#>


   <#+
    public class CodeTemplate : Template
    
        public string DatabaseName;
        public string ServerName;
        public string TableName;

        public override string TransformText()
        
            Server server = new Server(ServerName);
                server.ConnectionContext.LoginSecure = false;

                server.ConnectionContext.Login = "sa";
                server.ConnectionContext.Password = "123456";
            server.ConnectionContext.Connect();
            Database database = new Database(server, DatabaseName);
            Table table = new Table(database, TableName);
            table.Refresh();

                string DataType= string.Empty;
            WriteLine("using System;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n");

            WriteLine("namespace MyCustomEntities\n");

            WriteLine("//Select");
                WriteLine("\tpublic partial class My" +table.Name+ "\n\t");
            GenerateProperties(table);
                   //output the contructor
            WriteLine("\n\t\tpublic My" + table.Name + "()\n\t\t\n\t\t//constructor\n\t\t" );

            //end class
            WriteLine("\t");
              WriteLine("//Update Delete Save");
                WriteLine("\tpublic partial class My" +table.Name+ "\n\t");

                WriteLine("\t");
                WriteLine("");
            return this.GenerationEnvironment.ToString();
          

        protected void GenerateProperties( Table table)
        
                 foreach (Column  column in table.Columns)
                
                    switch(column.DataType.Name)
                    
                        case "nvarchar":
                        case "varchar":
                        case "nchar":
                        case "char":
                            WriteLine("\t\tpublic string "+column.Name+" get; set;");
                            break;
                        case "int":
                        case "smallint":
                        case "bigint":
                            WriteLine("\t\tpublic int "+column.Name+"  get; set;");
                            break;
                        case "datetime":
                            WriteLine("\t\tpublic DateTime "+column.Name+"  get; set;");
                            break;
                        case "image":
                            WriteLine("\t\tpublic byte[] "+column.Name+"  get; set;");
                            break;
                        case "bit":
                            WriteLine("\t\tpublic bool "+column.Name+"  get; set;");
                            break;
                    
            
        
    

   #>

我的连接代码:

<#@ template language="C#" hostspecific="True"  #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ assembly name="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.sfc, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Common" #>
<#@ assembly name="System.Xml"#>
<#@ output extension="txt" #>
<#@ import namespace="System.Reflection"#>

<#@ include file="T4Toolbox.tt" #> 
<#@ include file="CodeGenerator.tt" #> 

<# 
    CodeGenerator gen = new CodeGenerator();

    gen.ServerName="mysqlSERVER";
    gen.DatabaseName="FlyAnt";
    gen.Run();


#>

【问题讨论】:

如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ( )工具栏以很好地格式化和语法突出显示它!然后你也不需要任何烦人的&amp;#62;等等......只需正确格式化你的代码! 谢谢马克:我会用的。 【参考方案1】:

异常消息表明您正在尝试使用 Windows 帐户登录,该帐户是正在运行的进程的身份

System.Data.SqlClient.SqlException:用户登录失败 'MROTECHNIC\yusuf.karatoprak'

如果您查看堆栈跟踪,您会发现失败的连接尝试实际上源自the constructor of the Database class that takes the Server object as argument:

at Microsoft.SqlServer.Management.Common.ConnectionManager.Connect()
[...]
at Microsoft.SqServer.Management.Smo.Database..ctor(Server server, String name)
[...]
at T4Toolbox.Generator.Run()

似乎T4 Toolbox 也开始了生成过程。

【讨论】:

谢谢everythink ok 但是:编译转换:发生标识符预期错误 server.ConnectionContext.LoginSecure = false;可以服务器验证

以上是关于无法通过 T4 模板访问我的 SQL Server 2008 错误返回给我如何获取表?的主要内容,如果未能解决你的问题,请参考以下文章

在T4模板中设置断点

T4 预处理模板调试不起作用 - Visual Studio 2010 RTM

T4 模板在构建期间未转换

无法在 VS2017 上转换 T4 模板

T4模板学习心得

SQL Server 视图无法通过 ODBC 获得(逆向工程师)