私はこれを以前に行ったことがありますが、別の方法で行いました。以下のコードを機能させようとしています。「OriginalPhoto」または「Thumbnail」をキャストしないと、エラーが発生します。データ型 varchar から varbinary(max) への暗黙的な変換は許可されていません。CONVERT 関数を使用して、このクエリを実行します。キャストを要求する理由がわかりません。ただし、キャストすると、画像はバイナリデータ形式でデータベースに追加されます。画像を表示しようとすると、「指定されたデータを表示できません」というエラーが表示されます。SqlDataAdapter を使用して両方の byte[] をテーブルに挿入しましたが、それは機能します。この方法を使いたいのですが、何が間違っていますか?
プロファイル ギャラリー テーブルには次の内容が含まれます。
UserId nvarchar(50)
タイトル nvarchar(10)
OriginalImage varbinary(最大)
ThumbImage varbinary(最大)
protected void AddPhotoToDatabase()
{
byte[] OriginalPhoto = GetImage();
byte[] Thumbnail = GenerateThumbnail();
string Title = FileUpload1.FileName.ToString();
string sql = "INSERT INTO [ProfileGallery] ([UserId], [Title], [OriginalImage], [ThumbImage]) VALUES ('" + User.Identity.Name + "', '" + Title + "', CAST('" + OriginalPhoto + "'AS VARBINARY(MAX)), CAST('" + Thumbnail + "'AS VARBINARY(MAX)))";
string strCon = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["SocialSiteConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(strCon);
SqlCommand comm = new SqlCommand(sql, conn);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
protected byte[] GetImage()
{
byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
FileUpload1.PostedFile.InputStream.Read(photo, 0, photo.Length);
return photo;
}
protected byte[] GenerateThumbnail()
{
System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload1.PostedFile.InputStream);
double thumbwidth = 0;
double thumbheight = 0;
double imgsz = 150.0;
if (imgsz / image.Width < imgsz / image.Height)
{
thumbwidth = image.Width * (imgsz / image.Width);
thumbheight = image.Height * (imgsz / image.Width);
}
else
{
thumbwidth = image.Width * (imgsz / image.Height);
thumbheight = image.Height * (imgsz / image.Height);
}
System.Drawing.Image thumb = image.GetThumbnailImage((int)thumbwidth, (int)thumbheight, delegate() { return false; }, (IntPtr)0);
MemoryStream ms = new MemoryStream();
thumb.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}