Vous rencontrez des problèmes avec un morceau de code supposé s'exécuter sur un ensemble de données SQL Server. L'idée est qu'il lit dans redimensionne un fichier jpeg et l'écrit à nouveau. Il fonctionne bien sur une seule ligne. Toutefois, lors de l'exécution sur un grand ensemble de données, les lignes suivantes la commande de mise à jour échoue en raison d'un délai d'expiration. Pas sur toutes les lignes, mais ça passe sur la majorité.SqlConnection et SqlCommand expirent
using System.Drawing.Imaging;
using System.IO;
namespace MesResizer
{
class Program
{
static void Main(string[] args)
{
var con = ConfigurationManager.ConnectionStrings["SQLconnString"].ToString();
SqlConnection myConnection = new SqlConnection(con);
GetRows(myConnection);
myConnection.Close();
}
private static void GetRows(SqlConnection connection)
{
Boolean changed = false;
using (connection)
{
SqlCommand command = new SqlCommand("SELECT TOP(16000) strIIImage, intIIID FROM InspectionItem;", connection);
try
{
Writeout("Setting up Database connection..");
connection.Open();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
return;
}
Writeout("DONE");
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
using (MemoryStream ms = new MemoryStream())
{
int RowId = (int)reader.GetValue(reader.GetOrdinal("intIIID"));
Stream str;
changed = false;
try
{
str = reader.GetStream(reader.GetOrdinal("strIIImage"));
Image imgstr = Image.FromStream(str);
imgstr.Save("before.jpg", ImageFormat.Jpeg);
if (str.Length > 0)
changed = ScaleImage(Image.FromStream(str), ms);
}
catch (ArgumentException e)
{
Writeout("Stream does not have a valid image format or is Null... Unable to process image... " + RowId);
Writeout("Exception: " + e.Message);
}
if (changed)
WriteImage(ms, RowId);
else
Writeout("Image already resized: " + RowId);
}
}
}
else
{
Writeout("No rows found.");
Console.ReadLine();
}
reader.Close();
Console.ReadLine();
}
}
private static void WriteImage(MemoryStream ms, int RowId)
{
var conf = ConfigurationManager.ConnectionStrings["SQLconnString"].ToString();
SqlConnection writecon = new SqlConnection(conf);
writecon.Open();
using (FileStream file = new FileStream("after.jpg", FileMode.Create, System.IO.FileAccess.Write))
{
file.Write(ms.ToArray(), 0, (int)ms.Length);
}
using (SqlCommand cmd = new SqlCommand("UPDATE InspectionItem SET strIIImage = @Image WHERE intIIID = @Id", writecon))
{
cmd.Parameters.Add("@Image", SqlDbType.VarBinary, (int)ms.Length).Value = ms.ToArray();
cmd.Parameters.Add("@Id", SqlDbType.Int).Value = RowId;
cmd.CommandTimeout = 5;
try
{ //This is where it breaks. :)
cmd.ExecuteNonQuery();
}
catch (SqlException e)
{
Writeout(e.Message + "Error occured on row: " + RowId);
return;
}
}
Writeout("Succesfully Resized File: " + RowId);
writecon.Close();
}
}
}
Il y a un peu de choses supplémentaires qui se passe ici parce que je suis en train de vérifier l'image stockée est réellement redimensionnée et d'autres choses comme les lignes particulières qui éprouvaient la question.
J'ai commenté le code où le timeout arrive. :)
Toute information ou direction sera appréciée.
TIA.
EDIT Ran sur un certain nombre de formats d'image et un certain nombre de lignes sur 5000+ une base de données de test et n'a pas eu un problème du tout. Je peux voir que les données sont celles d'une image car j'écris chacune d'elles sur le disque mais il ne semble pas vouloir réécrire dans la base de données tout le temps. Très étrange
Modifier Juste au cas où quelqu'un voudrait connaître la résolution à ceci. Terminé par conclure que le SQLdatareader bloquait les lignes sur la base de données.
Je suis en train de sélectionner des blocs de lignes de la base de données en les déplaçant dans un datatable fermant le lecteur de données et en le redimensionnant et en le réécrivant si nécessaire. Je crois que la clé était de fermer le SqlDatareader et de libérer tous les verrous.
C'est beaucoup de code.S'il vous plaît ne coller que la partie pertinente – Alex
Sure ill mettre à jour il .. ne voulait pas laisser quelque chose hors de propos. –