在服务器数据库的列中插入客户端文件



我希望编写一个查询,将驻留在客户端(c# web服务器)上的文件插入到数据库服务器(SQL  server)的列中,类似于INSERT … SELECT * FROM OPENROWSET(BULK…),但不需要先将文件保存在服务器机器上。

这在SQL中是可能的吗?

虽然您的上下文未声明,但我假设您打算从SSMS而不是从OSQL, PowerShell脚本或通过其他方式运行此操作。

文件不需要驻留在运行SQL Server的物理机器上,但是SQL Server确实需要访问它。我认为,典型的方法是应用程序服务器将文件复制到共享存储库,然后通过UNC引用将其传递给sqlserver。这样做的语法相对简单,可以在通过使用Bulk INSERT或OPENROWSET(Bulk…)中找到。

如果你有兴趣为SQL Server提供一种机制来保存某些类型的流操作中的文件,其中客户端直接传输文件并且没有共享存储库,我不知道有什么方法可以做到这一点。即使您使用SQL FILESTREAM对象,您仍然需要一个可访问的NTFS位置来进行流。参见使用FileStream保存和检索文件SQL Server 2008

在某些时候,服务器必须对文件进行操作。这并不意味着服务器必须保留文件,但是文件必须到达服务器才能被读取并插入到db中。通常,这是通过一个表单和一个file型输入来实现的。在服务器上,您可以使用上传的文件来创建查询,然后删除它。

也就是说,在数据库中存储文件是一种有争议的做法。根据所存储文件的类型和大小,数据库的大小可能会迅速膨胀。对于初学者来说,这会使备份变得更慢,更容易失败,同时还会带来一长串其他潜在的陷阱。看看这个问题:在数据库中存储图像-是还是不是?从答案中可以看出,有许多需要考虑的因素,但一个好的经验法则是,除非有令人信服的理由,否则这样做。

。net中的SQL Server BLOB数据:教程中,Mohammad Elsheimy解释了如何完成:

using(SqlConnection con = new SqlConnection(conStr) )
using(SqlCommand command = new SqlCommand("INSERT INTO MyFiles VALUES (@Filename, @Data)", con) )
{
    command.Parameters.AddWithValue("@Filename", Path.GetFileName(filename));
    command.Parameters.AddWithValue("@Data", File.ReadAllBytes(filename));
    connection.Open();
}

基本上,通过这种方式在客户机上读取文件并将其发送到数据库服务器,而不需要在服务器机器上创建临时文件。