[英]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.