我希望编写一个查询,将驻留在客户端(C#Web服务器)上的文件插入到数据库服务器(SQL Server)的列中,类似INSERT … SELECT * FROM OPENROWSET(BULK…)
,但不必保存文件首先在服务器上运行。
这在SQL中是否可行?
答案 0 :(得分:2)
虽然您的上下文未说明,但我假设您打算从SSMS而不是OSQL,PowerShell 脚本或其他方式运行此操作。
该文件不需要驻留在运行SQL Server的物理盒上,但SQL Server确实需要访问它。我相信,典型的方法是让应用程序服务器将文件复制到共享存储库,然后通过UNC引用将其传递给SQL Server。这样做的语法相对简单,可以在 Importing Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) 中找到。
如果您有兴趣为SQL Server提供一种机制来保存某种类型的流操作的文件,其中客户端直接传输文件并且没有共享存储库,我不知道一种方法要做到这一点。即使您使用SQL FILESTREAM对象,仍然需要一个可访问的NTFS位置来进行流式传输。请参阅 Saving and Retrieving File Using FileStream SQL Server 2008 。
答案 1 :(得分:1)
在某些时候,服务器必须掌握文件。这并不意味着服务器必须保持文件,但文件必须到达服务器才能被读取并插入到数据库中。通常,这是通过表单和file
类型输入实现的。在服务器上,您可以使用上传的文件创建查询,然后将其删除。
也就是说,将文件存储在数据库中是一个值得商榷的做法。根据您存储的文件的类型和大小,您的数据库可以快速膨胀。对于初学者来说,这会使备份更慢,更容易出现故障,以及其他潜在陷阱的清单。在SO上查看这个问题:Storing Images in DB - Yea or Nay?正如您从答案中看到的那样,有许多需要考虑的事项,但一个好的经验法则是不这样做除非你有充分的理由这样做。
答案 2 :(得分:1)
在 SQL Server BLOB Data in .NET: Tutorial 中,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();
}
基本上,这样就可以在客户端上读取文件并将其发送到数据库服务器,而无需服务器计算机上的临时文件。