【问题标题】:How to save file in SQL Server database if have file path?如果有文件路径,如何将文件保存在 SQL Server 数据库中?
【发布时间】:2010-01-23 00:17:53
【问题描述】:

我正在构建一些 C# 桌面应用程序,我需要将文件保存到数据库中。我想出了一些文件选择器,它给了我正确的文件路径。现在我有疑问如何使用它的路径将该文件保存到数据库中。

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • 请不要使用名称或标签“mssql”。没有这样的产品,使用这些产品会让人们以后更难找到您的问题。

标签: c# sql-server sql-server-2005


【解决方案1】:

这实际上取决于文件的类型和大小。如果它是一个文本文件,那么您可以使用File.ReadAllText() 来获取一个可以保存在数据库中的字符串。

如果不是文本文件,则可以使用File.ReadAllBytes() 获取文件的二进制数据,然后将其保存到数据库中。

但请注意,数据库并不是存储大量文件的好方法(您会遇到一些性能问题)。

【讨论】:

    【解决方案2】:
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    int numBytes = new FileInfo(fileName).Length;
    byte[] buff = br.ReadBytes(numBytes);
    

    然后你像其他任何东西一样将它上传到数据库,我假设你正在使用一个 varbinary 列 (BLOB)

    【讨论】:

    • -1 任何建议将整个文件加载到 byte[] 中的解决方案都值得在我的书中投反对票
    • @RemusRusanu 在这种情况下你会建议什么解决方案?
    【解决方案3】:

    文件流就是这样,但是由于您使用的是 SQL 2K5,因此您必须以读入内存的方式进行;消耗大量资源。

    第一个列类型 varchar(max) 是你的朋友,它给你大约 2Gb 的数据来玩,这对于大多数用途来说是相当大的。

    接下来将数据读入字节数组并转换为Base64String

    FileInfo _fileInfo = new FileInfo(openFileDialog1.FileName);
                    if (_fileInfo.Length < 2147483647) //2147483647 - is the max size of the data 1.9gb
                    {
                        byte[] _fileData = new byte[_fileInfo.Length];
                        _fileInfo.OpenRead().Read(_fileData, 0, (int)_fileInfo.Length);
                        string _data = Convert.ToBase64String(_fileData);
                    }
                    else
                    {
                        MessageBox.Show("File is too large for database.");
                    }
    

    并逆向恢复

    byte[] _fileData  = Convert.FromBase64String(_data);
    

    您会希望在使用完这些字符串后尽快将它们设置为 string.empty 来处理它们!

    但如果可以,只需升级到 2008 并使用 FILESTREAM。

    【讨论】:

      【解决方案4】:

      如果您使用的是 SQL Server 2008,则可以使用FILESTREAM(入门指南here)。在 C# 中使用此功能的示例是 here

      【讨论】:

        【解决方案5】:

        您需要将该文件存储到一个字节数组中,然后将其作为一个 blob 字段存储在数据库中,并可能使用您想要为文件提供的名称和文件类型。

        你可以把这个过程反过来再把文件拿出来。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多