jaykhatri
asked on
Image storage in Sql
Hi,
I was working with images like storing the images on any location in HDD and mentioning its full path to sql. But this sometimes make trouble when you work on network based software and even location cannot get changed easily.
So I thought storing images in sql, but also thing that it might increase the size of database abnormally and people will not send the sample database to me with ease.
Can you suggest some pros and cons so that I may take the decision.
Thanks & Best Regards
Jay Khatri
I was working with images like storing the images on any location in HDD and mentioning its full path to sql. But this sometimes make trouble when you work on network based software and even location cannot get changed easily.
So I thought storing images in sql, but also thing that it might increase the size of database abnormally and people will not send the sample database to me with ease.
Can you suggest some pros and cons so that I may take the decision.
Thanks & Best Regards
Jay Khatri
Hello,
Use this link for your solution.
http://www.codeproject.com/KB/database/Store_images_in_SQL_Serve.aspx
Use this link for your solution.
http://www.codeproject.com/KB/database/Store_images_in_SQL_Serve.aspx
Advantages of Storing BLOB Data in the Database
Storing BLOB data in the database offers a number of advantages:
It is easier to keep the BLOB data synchronized with the remaining items in the row.
BLOB data is backed up with the database. Having a single storage system can ease administration.
BLOB data can be accessed through XML support in SQL Server 2005, which can return a base 64–encoded representation of the data in the XML stream.
SQL Server Full Text Search (FTS) operations can be performed against columns that contain fixed or variable-length character (including Unicode) data. You can also perform FTS operations against formatted text-based data contained within image fields—for example, Microsoft Word or Microsoft Excel documents.
Disadvantages of Storing BLOB Data in the Database
Carefully consider what resources might be better stored on the file system rather than in a database. Good examples are images that are typically referenced via HTTP HREF. This is because:
Retrieving an image from a database incurs significant overhead compared to using the file system.
Disk storage on database SANs is typically more expensive than storage on disks used in Web server farms.
The following code shows how to use ADO.NET to write binary data obtained from a file to an image field in SQL Server.
public void StorePicture( string filename )
{
// Read the file into a byte array
using(FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
byte[] imageData = new Byte[fs.Length];
fs.Read( imageData, 0, (int)fs.Length );
}
using( SqlConnection conn = new SqlConnection(connectionSt ring) )
{
SqlCommand cmd = new SqlCommand("StorePicture", conn);
cmd.CommandType = CommandType.StoredProcedur e;
cmd.Parameters.Add("@filen ame", filename );
cmd.Parameters["@filename" ].Directio n = ParameterDirection.Input;
cmd.Parameters.Add("@blobd ata", SqlDbType.Image);
cmd.Parameters["@blobdata" ].Directio n = ParameterDirection.Input;
// Store the byte array within the image field
cmd.Parameters["@blobdata" ].Value = imageData;
conn.Open();
cmd.ExecuteNonQuery();
}
}
Source - http://forums.asp.net/t/1096999.aspx
Storing BLOB data in the database offers a number of advantages:
It is easier to keep the BLOB data synchronized with the remaining items in the row.
BLOB data is backed up with the database. Having a single storage system can ease administration.
BLOB data can be accessed through XML support in SQL Server 2005, which can return a base 64–encoded representation of the data in the XML stream.
SQL Server Full Text Search (FTS) operations can be performed against columns that contain fixed or variable-length character (including Unicode) data. You can also perform FTS operations against formatted text-based data contained within image fields—for example, Microsoft Word or Microsoft Excel documents.
Disadvantages of Storing BLOB Data in the Database
Carefully consider what resources might be better stored on the file system rather than in a database. Good examples are images that are typically referenced via HTTP HREF. This is because:
Retrieving an image from a database incurs significant overhead compared to using the file system.
Disk storage on database SANs is typically more expensive than storage on disks used in Web server farms.
The following code shows how to use ADO.NET to write binary data obtained from a file to an image field in SQL Server.
public void StorePicture( string filename )
{
// Read the file into a byte array
using(FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
byte[] imageData = new Byte[fs.Length];
fs.Read( imageData, 0, (int)fs.Length );
}
using( SqlConnection conn = new SqlConnection(connectionSt
{
SqlCommand cmd = new SqlCommand("StorePicture",
cmd.CommandType = CommandType.StoredProcedur
cmd.Parameters.Add("@filen
cmd.Parameters["@filename"
cmd.Parameters.Add("@blobd
cmd.Parameters["@blobdata"
// Store the byte array within the image field
cmd.Parameters["@blobdata"
conn.Open();
cmd.ExecuteNonQuery();
}
}
Source - http://forums.asp.net/t/1096999.aspx
For the performance point, the recommonded method is storing in filesystem as mentioned in below link:
http://blog.sqlauthority.com/2007/12/13/sql-server-do-not-store-images-in-database-store-location-of-images-url/
But if you requirement required to be stored in database then you have no choice.
http://blog.sqlauthority.com/2007/12/13/sql-server-do-not-store-images-in-database-store-location-of-images-url/
But if you requirement required to be stored in database then you have no choice.
ASKER
My application is windows based app that will have maximum 20 clients. I was managing this in ms-access with filesystem (but in filesystem either you have to copy the image to your desired location or you have to put that original path) In both way either we duplicate the file or file will be selected from diff location) since I have migrated to sql server. Thought should try this.
1) How many images are you going to store in DB and what is the average size of an image ???
2) Which SQL Server version & type (Express, Standard etc) are you using ???
2) Which SQL Server version & type (Express, Standard etc) are you using ???
ASKER
More than 2000, like employee, student, guardian photos and people can scan docs from my app and store. It can increase to even 5k.
I am using sql server express edn. 2005 (now I will use 2008 express edn.)
I am using sql server express edn. 2005 (now I will use 2008 express edn.)
ASKER
And in addition one more question, if I add 512KB of image in the database, how much a database will increase in size. and how much it is related to the file stream.
ASKER
My idea is to make separate database for images so that people may send me the data only.
By this way I can handle the stuff.
By this way I can handle the stuff.
HI again 5k * 2000 is about only 10MB , 2005 express can hold up to 4GB , 2008 express extends it to 10GB.
So, I think that you can easily store it in DB without any problem.
Database size increases according to values given in creation , if you want you can alter this by the attached code.
I do not think that you need a separate database for that , it will makes troubles when you want to join information from both databases , according to your requirements , one database can handle both
So, I think that you can easily store it in DB without any problem.
Database size increases according to values given in creation , if you want you can alter this by the attached code.
I do not think that you need a separate database for that , it will makes troubles when you want to join information from both databases , according to your requirements , one database can handle both
// The following will set database db_name to increase each time by allocation more 10MB
alter database db_name
modify file (name = db_name, FILEGROWTH = 10)
ASKER
I am really sorry for posting confused statement, 5k was meant as 5000 images and each image will take 512KB approx. I don't know the ratio of storing blob : filestream.
Regarding two separate databases its true that I have to make two separate connections which will make trouble in joining. So I dropped the plan and even I am thinking to go with filestreams.
Your Idea please ?
Regarding two separate databases its true that I have to make two separate connections which will make trouble in joining. So I dropped the plan and even I am thinking to go with filestreams.
Your Idea please ?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Basically, it depends on your application ...
Read the following
http://www.databasejournal.com/features/mssql/article.php/3719221/Storing-Images-and-BLOB-files-in-SQL-Server.htm
And if you want a really deep comparison , read that , it worth the effort
http://research.microsoft.com/pubs/64525/tr-2006-45.pdf