none
Assemblie solo funciona localmente RRS feed

  • Pregunta

  • Hola

    Desarrolle en C# una dll que cuenta la cantidad de archivos de texto que hay en una ruta determinada.

    Se le pasa la ruta y arroja la cantidad de archivos de texto que hay en dicha ruta.

    Me funciono bien cuando probé dicha clase en un proyecto dentro del visual studio for windows 2012.

    Le daba incluso una ruta que correspondía a una unidad mapeada, vale decir, una ruta externa de un servidor que tengo mapeado en mi equipo. Me funcionó bien. Pero el problema es cuando tras crear la dll para luego incorporarla como assemblie dentro de sql server me funciona solo para unidades locales donde se halla la base de datos. O sea, solo cuenta bien si le doy una ruta que existe localmente dentro del servidor de base de datos pero si le doy una ruta que hace referencia a una de sus unidades mapeadas que apuntan a un servidor externo me devuelve 0 aunque existan archivos. Es como si algo evitara que acceda a esa ruta para ejecutar el metodo, tal vez un tipo de permiso, no lo se.

    Dejo mi código

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;

    namespace GetNumberFiles
    {
        public class CountingFiles
        {
            public int num = 0;
            public int countNow(String inputString)
            {
                string errores = "";
                try
                {
                    DirectoryInfo directory = new DirectoryInfo(@inputString);
                    FileInfo[] files = directory.GetFiles("*.txt");
                    DirectoryInfo[] directories = directory.GetDirectories();
                    for (int i = 0; i <= files.Length; i++)
                    {
                        num = i;                   
                    }
                                }
                 catch (Exception ex)
                 {
                    errores = ex.ToString();
                    num = 100;
                 }
                return num ;
            }

        }
    }

    jueves, 21 de mayo de 2015 5:43

Respuestas

  • Dejo mi código [...]

    No quisiera molestar, pero la totalidad de la rutina que has escrito se puede implementar en una línea:

    public int countNow(String inputString)
    {
        return System.IO.Directory.GetFiles(inputString, "*.txt").Length;
    }
    
    Aparte de eso, si lo has instalado como Assembly en SQL Server, el primer escollo a superar (en cuanto a permisos) es que lo tienes que montar con el permiso de EXTERNAL_ACCESS. Y lo segundo, es que se ejecutará con la cuenta de servicio de SQL Server, por lo que esa cuenta necesita permiso de acceso a la carpeta compartida del servidor remoto. Solo lo conseguirás si es una cuenta de dominio. Si es una cuenta local sin contraseña (tal como NT AUTHORITY\NetworkService) tendrás problemas para conseguir que el servidor remoto la reconozca, y no podrás ponerle los permisos.
    • Propuesto como respuesta Sergio ParraModerator jueves, 21 de mayo de 2015 20:15
    • Marcado como respuesta Michifuz viernes, 22 de mayo de 2015 19:19
    jueves, 21 de mayo de 2015 20:11

Todas las respuestas

  • un apunte sobre tu codigo

    esto

    for (int i = 0; i <= files.Length; i++)
                     {
                         num = i;                   
                     }

    es ineficiente ya que puedes cambiarlo,pir

    num= files.Length


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de mayo de 2015 5:46
    Moderador
  • También te recomiendo des permisos a dicha carpeta compartida a la cuenta de usuario sobre la que se ejecuta SQL Server o SQL Agent

    Saludos


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de mayo de 2015 6:45
    Moderador
  • la cuenta de usuario sobre la que se ejecuta sql server es   NT AUTHORITY\NetworkService

    Tengo que darle permisos a NT AUTHORITY sobre la carpeta origen? o sea, tendre que ir al servidor 172.29.1.19 y en esa carpeta darle permiso a ese usuario?

    jueves, 21 de mayo de 2015 19:38
  • ese es un buen comienzo. Vamos a ver que tal

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de mayo de 2015 19:48
    Moderador
  • te recomiendo que implementes algún sistema de log en tu ensamblado para tracear problemas que,puedan surgir.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de mayo de 2015 20:04
    Moderador
  • Dejo mi código [...]

    No quisiera molestar, pero la totalidad de la rutina que has escrito se puede implementar en una línea:

    public int countNow(String inputString)
    {
        return System.IO.Directory.GetFiles(inputString, "*.txt").Length;
    }
    
    Aparte de eso, si lo has instalado como Assembly en SQL Server, el primer escollo a superar (en cuanto a permisos) es que lo tienes que montar con el permiso de EXTERNAL_ACCESS. Y lo segundo, es que se ejecutará con la cuenta de servicio de SQL Server, por lo que esa cuenta necesita permiso de acceso a la carpeta compartida del servidor remoto. Solo lo conseguirás si es una cuenta de dominio. Si es una cuenta local sin contraseña (tal como NT AUTHORITY\NetworkService) tendrás problemas para conseguir que el servidor remoto la reconozca, y no podrás ponerle los permisos.
    • Propuesto como respuesta Sergio ParraModerator jueves, 21 de mayo de 2015 20:15
    • Marcado como respuesta Michifuz viernes, 22 de mayo de 2015 19:19
    jueves, 21 de mayo de 2015 20:11
  • cierto Alberto.. No me acordaba de lo de la cuenta local. Hay que usar cuenta de usuario de dominio para que el servidor remoto que comparte la carpeta de permisos a dicho usuario. Me ha quedado claro

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 21 de mayo de 2015 20:15
    Moderador
  • Estimado Sergio

    Ya le puse para que el sqlserver se ejecute con la misma cuenta a la que di permisos sobre esa ruta

    pero esto me aparece:

    Msg 6522, Level 16, State 1, Line 1
    A .NET Framework error occurred during execution of user-defined routine or aggregate "upfGetfiles": 
    System.IO.DirectoryNotFoundException: Could not find a part of the path 'M:\'.
    System.IO.DirectoryNotFoundException: 
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
       at System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
       at GetNumberFiles.CountingFiles.countNow(String inputString)

    jueves, 21 de mayo de 2015 22:24