我在SQL Server数据库中有一个带有(ST_Distance(rpoint, 'POINT( ? )', True)/1000)
$result = DB::select($expression, [$lon.' '.$lat, ...]);
列的表,其中包含zip存档。我如何获取这些档案的列表而不提取它们?我的C#应用程序读取这些档案的列表,我需要添加有关内容的更多信息。
对于文件,我使用varbinary(max)
程序集中的ZipFile
类,但是如何传递varbinary数据而不是文件名(例如,如果我创建CLR Function)?
答案 0 :(得分:0)
这是您要寻找的吗?
SQLCLR C#函数...
using System.Data.SqlTypes;
using System.IO;
using System.IO.Compression;
using System.Linq;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString ZipEntries(SqlBytes data) {
using (var stream = new MemoryStream(data.Value))
using (var archive = new ZipArchive(stream))
return new SqlString(string.Join(",", archive.Entries.Select(e => e.Name)));
}
}
这是我用来测试的SQL。令人惊讶的是,它起作用了...
-- Create table with ZIP archive column...
CREATE TABLE dbo.ZipImages(ZipArchive VARBINARY(MAX));
GO
-- ... then insert ZIP archive content into the dbo.ZipImages table ...
-- (code not included)
GO
-- ... then prove it works.
SELECT dbo.ZipEntries(ZipArchive) FROM dbo.ZipImages;
GO
您的数据库可能会抱怨System.IO.Compression不可用,在这种情况下,您可以尝试...
ALTER DATABASE [<your database>] SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.IO.Compression]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
(如果您不是DBA,则希望快速结交朋友。)
显然,这只是一个准UDF,您可能想做一些不同的事情(例如使它成为基于表的CLR UDF以逐项返回条目)。
如果您需要从数据列中的存档中打开文件,它将变得更加棘手。除其他外,您将必须添加System.IO.Compression.File作为程序集,(不幸的是)这是UNSAFE并使一堆事情变得复杂...
CREATE ASSEMBLY [System.IO.Compression.FileSystem]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.FileSystem.dll'
WITH PERMISSION_SET = UNSAFE;