我正在尝试构建一个允许用户选择图像的应用程序,然后再上传到SQL服务器表中。
问题是存储的数据似乎不完整。我试图通过一个在线转换器(即http://www.lokowebdesign.com/imagetobinary/),但收到一个错误,指出它不是一个可识别的格式。
因为它存储在表中,所以数据如下所示:
0xFFD8FFE000104A46494600010201006000600000FFEE000E41646F626500640000000001FFE10DDE4578696600004D4D002A000000080006013200020000001400000056013B00020000000B0000006A47460003000000010005000047490003000000010058000082980002000000160000007687690004000000010000008C
以下是一些相关的代码段:
//表的定义,Grid
DataTable grid = new DataTable("Grid");
grid.Columns.Add("ID", typeof(int));
grid.Columns.Add("Description", typeof(String));
grid.Columns.Add("Points", typeof(int));
grid.Columns.Add("Score", typeof(List<int>));
grid.Columns.Add("Current", typeof(int));
grid.Columns.Add("Comments", typeof(List<String>));
grid.Columns.Add("SelectedComment", typeof(int));
grid.Columns.Add("SelectedCommentText", typeof(String));
grid.Columns.Add("Category", typeof(int));
grid.Columns.Add("SelectedScore", typeof(int));
grid.Columns.Add("Image", typeof(byte[]));
// report_details table
insert = new SqlCommand("INSERT into dbo.report_details (reportID, itemID, points, comments, image) " + " VALUES (@reportID, @itemID, @points, @comments, @image)", con);
insert.Parameters.Add("@reportID", SqlDbType.Char, 5, "reportID");
insert.Parameters.Add("@itemID", SqlDbType.Int, 5, "itemID");
insert.Parameters.Add("@points", SqlDbType.Int, 4, "points");
insert.Parameters.Add("@comments", SqlDbType.Text, 150, "comments");
insert.Parameters.Add("@image", SqlDbType.Image, (int)Math.Pow(2, 20), "image");
//基于DataGrid绑定表Grid
更新report_details(在数据库中) foreach (DataRow row in ds.Tables["Grid"].Rows)
{
DataRow reportDetailsRow = ds.Tables["Details"].NewRow();
reportDetailsRow["reportID"] = id;
reportDetailsRow["itemID"] = row["ID"];
reportDetailsRow["points"] = row["Current"];
List<String> comments = (List<String>)row["Comments"];
reportDetailsRow["comments"] = row["SelectedCommentText"];
if (row["Image"] != null)
{
reportDetailsRow["image"] = row["Image"];
}
ds.Tables["Details"].Rows.Add(reportDetailsRow);
}
detailsAdapter.Update(ds, "Details");
tran.Commit();
}
//当用户点击按钮附加图片时调用
private async void uploadImage(Object sender, RoutedEventArgs e)
{
Bitmap photo = null;
// this is for tablets
try
{
capturePhoto capture = new capturePhoto();
photo = await capture.getImage();
}
catch (Exception ex)
{
// this is what I am actually using for testing
OpenFileDialog fileDialog = new OpenFileDialog();
if (fileDialog.ShowDialog() == true)
{
photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile());
}
}
DataRowView row = (DataRowView)itemGrid.CurrentItem;
ImageConverter converter = new ImageConverter();
byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ;
row["Image"] = photoBytes;
}
}
我真的希望我提供了足够的细节,但如果需要可以提供更多。这对我来说是一个非常棘手的问题,所以我非常感谢任何指导。非常感谢!
编辑:我尝试了以下内容,同样的问题仍然存在:
private async void uploadImage(Object sender, RoutedEventArgs e)
{
Bitmap photo = null;
try
{
capturePhoto capture = new capturePhoto();
photo = await capture.getImage();
}
catch (Exception ex)
{
OpenFileDialog fileDialog = new OpenFileDialog();
if (fileDialog.ShowDialog() == true)
{
photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile());
}
}
DataRowView row = (DataRowView)itemGrid.CurrentItem;
// ImageConverter converter = new ImageConverter();
// byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ;
MemoryStream mem = new MemoryStream();
using (mem)
{
photo.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
row["Image"] = mem.ToArray();
}
// row["Image"] = photoBytes;
}
}
答案 0 :(得分:1)
首先,根据this MSDN article:
将来的MicrosoftSQL Server版本中将删除ntext ,文本和图像数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max),varchar(max)和varbinary(max)。
我不确定图像列类型是否存在奇怪的格式,但您发布的示例数据几乎 base64,但它的长度无效。您在编辑中发布的用于保存图像的代码对我来说是正确的,因此要测试此理论,您可以将图像转换为base64并与您在数据库中看到的进行比较:
var data = mem.ToArray();
var base64 = Convert.ToBase64(data);