繁体   English   中英

永久File.Exist CLR C#从SQL Server调用但在C#中工作时不起作用

[英]The Eternal File.Exist CLR C# not working when called from SQL Server but working in C#

我正在使用CLR来验证文件是否存在使用C#方法。 我在sql server中创建了一个程序集和函数,我正在传递一个参数。

C#代码:

using System;
using System.IO;

public class FileExist
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static bool fn_FileExistCLR(string FilePath){     

     return System.IO.File.Exists(FilePath);                
  }
}

我在sql server中创建了程序集:

CREATE ASSEMBLY FileExistCLR2
FROM 'C:\MSSQLTips\FileExist2.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

我也创建了这个功能:

CREATE FUNCTION [dbo].[fc_ChkFlCLR2](@filename [nvarchar](4000))
RETURNS nvarchar(4000) WITH EXECUTE AS CALLER
AS 
     EXTERNAL NAME [FileExistCLR2].[FileExist].[fn_FileExistCLR] 
GO

函数将一个参数传递给CLR。

declare @filevar as nvarchar(4000)
set @filevar = ltrim(rtrim('T:\\Project\\XML_ErrorFile20131106.txt'))
--set @filevar = ltrim(rtrim('C:\QA_Ticket.xls'))
SELECT [PlayNet].[dbo].[fc_ChkFlCLRChk] (@filevar)   
GO

正在找到本地文件,但不能找到网络文件夹中的文件:

结果1 - 如果文件位于网络文件夹中,则函数返回false结果2 - 如果文件位于本地文件夹中,则函数返回TRUE。

我在本地sql服务器上运行这些并尝试添加@也无济于事。

交叉检查。 我创建了一个C#方法,在命令行中输出结果。 奇怪的是,file.exist正在检测网络中的同一文件。 请帮忙

using System;
using System.IO;

class FileExist
{
   // [Microsoft.SqlServer.Server.SqlFunction]
    static void Main()
        {
        string FilePath = "T:\\Project\\XML_ErrorFile20131106.txt";
        string retFilePath;
            if (File.Exists(FilePath))
            {
                 retFilePath = "True";
                 Console.WriteLine(retFilePath);
                    Console.ReadLine();
            }
            else 
                retFilePath = "false";
                Console.WriteLine(retFilePath);
                    Console.ReadLine();
        }
}

问题很可能是SQL Server进程正在运行的用户没有T驱动器。 使用UNC驱动器表示法进行此类工作会更好(也更安全)(即\\\\thefileshare\\project\\xml...txt )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM