вот есть код на C#, он вставляет 100 картинок размером 430кб в базу данных на MS SQL Server 2000. Вставляет очень и очень медленно, так как вставляет кусочками по 16 байт. Размер поля Image 16 байт, соотвественно выбраны и кусочки. С такими параметрами время записи превышает 2 часа блин. Это жутко бесит Кто-нибудь знаешь как можно уменьшить время записи в БД? Одно из решений - это увеличить размер куска с 16 байт до 16 кб или больше, но как это сделать? ведь размер поля типа Image менять нельзя, он всегда 16 байт.
код:
private void Encrypt_Click(object sender, System.EventArgs e) { start.Text = DateTime.Now.ToString(); using ( SqlConnection connection = new SqlConnection("Data source=Server; Initial Catalog=mytestdb; User ID='sa';") ) { // Writing an image to a DB connection.Open(); DirectoryInfo di = new DirectoryInfo(@"D:distship"); ArrayList files = new ArrayList(di.GetFiles("*.tif.pgp")); for ( int i = 0; i < files.Count; i++ ) { FileInfo fi = files[i] as FileInfo; SqlCommand sqlCommand = new SqlCommand("INSERT INTO Images (ID, HHRefNumber, ReplaceCount, ReplaceDate, ImageSrc) " + "Values (newid(), @OrderNumber, @ReplaceCount, @ReplaceDate, 0x0);" + "SELECT @Pointer = TEXTPTR(ImageSrc) FROM Images WHERE HHRefNumber = @OrderNumber", connection); sqlCommand.Parameters.Add("@OrderNumber", SqlDbType.VarChar, 50).Value = i.ToString(); sqlCommand.Parameters.Add("@ReplaceCount", SqlDbType.Int, 4).Value = 0; sqlCommand.Parameters.Add("@ReplaceDate", SqlDbType.DateTime, 8).Value = DateTime.Now; SqlParameter ptrParm = sqlCommand.Parameters.Add("@Pointer", SqlDbType.Binary, 16); ptrParm.Direction = ParameterDirection.Output; sqlCommand.ExecuteNonQuery(); StorePhoto(fi.FullName, (byte[])ptrParm.Value, connection); } } finish.Text = DateTime.Now.ToString(); } private void StorePhoto(string path, byte[] pointer, SqlConnection conn) { int bufferLen = 16; // The size of the "chunks" of the image. SqlCommand appendToPhoto = new SqlCommand("UPDATETEXT Images.ImageSrc @Pointer @Offset 0 @Bytes", conn); SqlParameter ptrParm = appendToPhoto.Parameters.Add("@Pointer", SqlDbType.Binary, 16); ptrParm.Value = pointer; SqlParameter photoParm = appendToPhoto.Parameters.Add("@Bytes", SqlDbType.Image, bufferLen); SqlParameter offsetParm = appendToPhoto.Parameters.Add("@Offset", SqlDbType.Int); offsetParm.Value = 0; FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); byte[] buffer = br.ReadBytes(bufferLen); int offset_ctr = 0; while (buffer.Length > 0) { photoParm.Value = buffer; appendToPhoto.ExecuteNonQuery(); offset_ctr += bufferLen; offsetParm.Value = offset_ctr; buffer = br.ReadBytes(bufferLen); } br.Close(); fs.Close(); }