如何在数据库中保存不同类型的文件

其实,向数据库中保存不同类型的文件,和在数据库中保存图片是一样的。就是向数据库以byte形式存入。以下就简单举例说明:

 

首先,在数据库中要建立相应的字段能保存Bytes,例如在SQL Server中用Image类型来定义字段。我所用到的数据库大致结构如下:

字段名

类型

备注

FileID

Int

自增字段

FileName

Varchar(256)

 

FullName

Varchar(1024)

 

FileData

Image

 

 

然后就是写入数据库,代码如下:

        FileInfo fi = new FileInfo( txtFileName.Text );// Replace with your file name

        if ( fi.Exists)

        {

            byte[] bData = null;

            int nNewFileID = 0;

            // Read file data into buffer

            using ( FileStream fs = fi.OpenRead() )

            {

                bData = new byte[fi.Length];

                int nReadLength = fs.Read( bData,0, (int)(fi.Length) );

            }

 

            // Add file info into DB

            string strQuery = "INSERT INTO FileInfo "

                + " ( FileName, FullName, FileData ) "

                + " VALUES "

                + " ( @FileName, @FullName, @FileData ) "

                + " SELECT @@IDENTITY AS 'Identity'";

            SqlCommand sqlComm = new SqlCommand( strQuery, sqlConn );

            sqlComm.Parameters.Add( "@FileName", fi.Name );

            sqlComm.Parameters.Add( "@FullName", fi.FullName );

            sqlComm.Parameters.Add( "@FileData", bData );

 

            // Get new file ID

            SqlDataReader sqlReader = sqlComm.ExecuteReader();

            if( sqlReader.Read() )

            {

                nNewFileID = int.Parse(sqlReader.GetValue(0).ToString());

            }

            sqlReader.Close();

            sqlComm.Dispose();

 

            if( nNewFileID > 0 )

            {

                // Add new item in list view

                ListViewItem itmNew = lsvFileInfo.Items.Add( fi.Name );

                itmNew.Tag = nNewFileID;

            }

        }

 

而读出的代码如下:

    // Get new file name

    string strFullName = dlgFBSave.SelectedPath;

    if( strFullName[strFullName.Length - 1] != '//' )

        strFullName += @"/";

    strFullName += lsvFileInfo.SelectedItems[0].Text;

 

    string strQuery = "SELECT FileData FROM FileInfo "

        + " WHERE FileID = " + lsvFileInfo.SelectedItems[0].Tag.ToString();

 

    SqlDataAdapter sqlDAdapter = new SqlDataAdapter(strQuery,sqlConn);

    DataSet sqlRecordSet = new DataSet();

 

    byte[] bData = null;

 

    //Get file data from DB

    try

    {

        sqlDAdapter.Fill( sqlRecordSet, "FileInfo" );

        foreach( DataRow dr in sqlRecordSet.Tables["FileInfo"].Rows)

        {

            if( dr["FileData"] != DBNull.Value )

            bData = ( byte[] )dr["FileData"];

        }

    }

    catch(SqlException sqlErr)

    {

        MessageBox.Show( sqlErr.Message );

    }

    catch

    {

        MessageBox.Show( "Failed to read data from DB!" );

    }

    sqlRecordSet.Dispose();

    sqlDAdapter.Dispose();

 

    if( bData != null )

    {

        // Save file

        FileInfo fi = new FileInfo( strFullName );

        if( !fi.Exists )

        {

            //Create the file.

            using (FileStream fs = fi.Create())

            {

                fs.Write( bData, 0, bData.Length);

            }

        }

        else

        {

            //Create the file.

            using (FileStream fs = fi.OpenWrite())

            {

                fs.Write( bData, 0, bData.Length);

            }

        }

    }

 

       不过需要提的一点,如果把大量的文件存入数据库的话,会造成数据库的臃肿,而且访问量也会增大。所以现在比较流行的做法,是把文件上传到服务器上,而在数据库上只保存文件的相对路径即可。那么访问的时候,先通过数据库得到文件的相对路径,然后再访问服务器上的文件。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值