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

时间:2011-09-19 17:29:13

标签: sql-server insert

我希望编写一个查询,将驻留在客户端(C#Web服务器)上的文件插入到数据库服务器(SQL Server)的列中,类似INSERT … SELECT * FROM OPENROWSET(BULK…),但不必保存文件首先在服务器上运行。

这在SQL中是否可行?

3 个答案:

答案 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();
}

基本上,这样就可以在客户端上读取文件并将其发送到数据库服务器,而无需服务器计算机上的临时文件。