【问题标题】:How store a large file into SQL Server 2008 and retrieve all of it?如何将大文件存储到 SQL Server 2008 并检索所有文件?
【发布时间】:2013-02-12 21:13:18
【问题描述】:

我的问题与 SQL Server 数据库有关。

我使用以下代码成功地将数据从 C# 存储到 SQL Server 表中:

 internal static void SaveAutocadFileOnDataBase(string MapCode, byte[] dataElecMap, string dataElecMapName,byte[] dataCivilMap, string dataCivilMapName, byte[] dataArchiMap, string dataArchiMapName,byte[]dataMechaMap,string dataMechaMapName)
        {
            string sqlcommand = string.Concat("INSERT INTO AutoCadFiles VALUES ('", MapCode, "' , ", "cast ('", dataElecMap, "' as varbinary(max)),", " '", dataElecMapName, "' ", " , cast ('", dataCivilMap, "' as varbinary(max)) ,", " '", dataCivilMapName, "' ", " , cast ('", dataArchiMap, "' as varbinary(max)) ,", " '", dataArchiMapName, "' "," , cast ('", dataMechaMap, "' as varbinary(max)) ,", " '", dataMechaMapName, "' ", ")");  ExecuteNonQuery(sqlcommand);
        }

并使用此代码检索它:

    internal static DataTable RetriveMaps(string MapNumber, string MapType)
    {
        string s = MapType + "Name";
        string SqlCommand = string.Concat("SELECT ", MapType, " , ", s, " FROM AutoCadFiles WHERE MapCode='",MapNumber, "'");
        return GetBinaryFiles(SqlCommand);
    }

    private static DataTable GetBinaryFiles(string SqlCommand)
    {
        SqlConnection SqlConnction = null;
        DataTable dt = new DataTable();
        SqlCommand sqlcom = GetConnection(SqlCommand, ref  SqlConnction);
        SqlDataReader sdldr = sqlcom.ExecuteReader();
        dt.Load(sdldr);
        return dt;
    }

我成功地从 dataTable 中获取文件并将其保存到文件系统中。但是存储的文件量是0字节

或比数据库中存储的文件少 13 个字节。

【问题讨论】:

  • Abbas,你这里缺少代码吗?你在哪里把它保存到FileStream ..?
  • 你应该在你的代码中read about how to avoid SQL injection attacks!你目前非常脆弱......
  • “我成功存储数据”你怎么知道? (它没有成功)。你有没有看过文件的内容?阅读有关如何执行此操作的教程。
  • 如果您努力调试自己,但没有找到错误,我会告诉您错误是什么。这并不难找到。你可以的!

标签: c# sql-server wpf sql-server-2008


【解决方案1】:

由于您一次检索一行,因此这个更简单的代码可以完成检索数据的工作:

        string fileName;
        byte[] fileread;

        SqlCommand command;
        SqlConnection connection = MyGetSqlConnection();

        connection.Open();

        command = new SqlCommand("Select dataElecMapName From AutoCadFiles  Where MapCode = @MapNumber", connection);
        command.Parameters.Add("@MapNumber", SqlDbType.Int).Value = MapNumber;
        fileName = (string)command.ExecuteScalar();
        command.Dispose();

        command = new SqlCommand("Select dataElecMap From AutoCadFiles  Where MapCode = @MapNumber", connection);
        command.Parameters.Add("@MapNumber", SqlDbType.Int).Value = MapNumber;

        fileread = (byte[])command.ExecuteScalar();

        string tempPath = MyFunc.GetTempDirectory();

        FileStream fs = new FileStream(tempPath + fileName, FileMode.Create);
        fs.Write(fileread, 0, fileread.Length);

        System.Diagnostics.Process.Start(tempPath + fileName);

        fs.Close();

编辑 使用此代码转换您的文件:

    public static byte[] ConvertFileToBytes(string location, ref string FileName) 
    { 
        FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read);

        BinaryReader reader = new BinaryReader(fs);

        byte[] data = reader.ReadBytes((int)fs.Length);

        fs.Close(); 
        return data; 
    } 

【讨论】:

  • 但这不是我的问题,当我说“我成功存储了数据”时,我说的是在 sql usr 中存储数据,谢谢。
  • Cesar Vega 非常感谢您。测试您的代码。这很好,但我的问题没有解决。它完全可以工作我的代码工作。这是我用于将数据转换为字节数组的代码 public static byte[] ConvertFileToBytes(string location, ref string FileName) { FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read);字节[] 数据 = 新字节[fs.Length]; fs.Read(data, 0, System.Convert.ToInt32(fs.Length)); fs.Close();返回数据; }
  • 但我认为我的代码中不存在 Bug。我认为 var Binary(max) Max 不是真的 SQL 类型用于保存大于 2mb 的数据。我的字段类型需要 SQL 类型。你能帮帮我吗?
  • varbinary(max) 最多可容纳 2^31-1 个字节。那不是问题。该错误必须在您存储数据的方式中。我能看到的唯一问题是您将 FileStream.Length 转换为 Int32,虽然它的类型是 Long,但除非您存储的文件非常大,这应该不是问题。请参阅我的扩展答案。
  • 嗨,Cesar,我测试了您的代码,但我的错误没有解决。看看当我上传字节数组时它的长度非常大,但是当我从 sql 重新启动它时它的长度是 13
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 2015-06-07
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2015-03-13
相关资源
最近更新 更多