2011-09-19 45 views
2

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

这甚至可能在SQL?

+3

问题通常涉及查询,疑问和/或问号。正如所写的,对你的“问题”的准确“答案”可能是**整洁,玩得开心!** – JNK

+0

谢谢,编辑,现在好多了? – kroiz

+1

是可能的,但实施可能会因客户端软件而异。例如,根据您使用的是SSIS还是Web应用程序,这可能会有所不同。此外,列的数据类型是什么,例如BLOB,NTEXT,FileStream? –

回答

1

SQL Server BLOB Data in .NET: Tutorial穆罕默德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(); 
} 

基本上,这样的文件是只读的客户端和发送到数据库服务器,而不需要一个临时文件服务器机器。

1

在某些时候,服务器将不得不在文件上。这并不意味着服务器必须保留该文件,但该文件必须到达服务器才能读取并插入到数据库中。通常,这是通过一个表单和一个file类型的输入实现的。在服务器上,您可以使用上传的文件创建查询,然后将其删除。

也就是说,将文件存储在数据库中是一个有争议的做法。根据您存储的文件的类型和大小,您的数据库可能会快速膨胀。对于初学者来说,这会使备份更慢,更容易失败,同时还会列出其他潜在缺陷的清单。看看SO上的这个问题:Storing Images in DB - Yea or Nay?正如你可以从答案中看到的那样,有很多需要考虑的事项,但一个好的经验法则是而不是这样做,除非你有令人信服的理由这样做。

2

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

该文件不需要驻留在运行SQL  服务器的物理盒子上,但SQL  服务器确实需要对其进行访问。我相信,典型的方法是让应用程序服务器将文件复制到共享存储库,然后通过UNC引用将其传递到SQL  服务器。这样做的语法比较简单,可以在Importing Bulk Data by Using BULK INSERT or OPENROWSET(BULK...)中找到。

相反,如果您有兴趣提供一种SQL Server从某种类型的流操作保存文件的机制,客户机直接传输文件并且没有共享存储库,我不知道方法来做到这一点。即使您使用SQL FILESTREAM对象,您仍然需要可访问的NTFS位置进行流式传输。见Saving and Retrieving File Using FileStream SQL Server 2008

+0

+1我也删除了我之前的评论。他们只是在这一点上增加了噪音,但是再次如此 –

相关问题