Не удается получить доступ к моему серверу SQL Server 2008 по шаблону T4. Возврат мне как получить таблицы? - PullRequest
1 голос
/ 24 ноября 2011

Я хочу сгенерировать некоторый код, используя шаблон T4. Я подключаюсь, используя "sa" и пароль sa. Но я не могу подключиться к удаленному серверу SQL. Я использую 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 исключение, Boolean breakConnection)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning ()
в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin (Boolean enlistOK)
в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject)
в System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover (ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
в System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist (SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
в System.Data.SqlClient.SqlInternalConnectionTds..ctor (DbConnectionPoolIdentity идентичность, SqlConnectionString connectionOptions, объект providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
в System.Data.SqlClient.SqlConnectionFactory.CreateConnection (DbConnectionOptions параметры, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection владениеConnection)
в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnection owningConnection, пул DbConnectionPool, параметры DbConnectionOptions)
в System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection owningObject)
в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (DbConnection owningObject)
в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject)
в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection)
в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory)
в System.Data.SqlClient.SqlConnection.Open ()
в Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect (WindowsIdentity impersonatedIdentity)
в 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 newParent)
в Microsoft.SqlServer.Management.Smo.SqlSmoObject.SetParentImpl (SqlSmoObject newParent)
--- Конец внутренней трассировки стека исключений --- в Microsoft.SqlServer.Management.Smo.SqlSmoObject.SetParentImpl (SqlSmoObject newParent)
в 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();


#>

1 Ответ

1 голос
/ 24 ноября 2011

В сообщении об исключении говорится, что вы пытаетесь войти в систему, используя учетную запись Windows, которая является идентификатором запущенного процесса :

System.Data.SqlClient.SqlException: Не удалось войти в систему для пользователя 'MROTECHNIC \ yusuf.karatoprak'

Если вы посмотрите на трассировку стека, вы обнаружите, что неудачная попытка подключения на самом деле происходит из конструктора класса Databaseкоторый принимает объект Server в качестве аргумента :

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

Также кажется, что процесс генерации запускается T4 Toolbox .

...