问题描述
我想从我的C#Windows窗体应用程序将扫描的图像(车辆文档)添加到sql Server数据库中。在sql Server数据库中,将要保存扫描文档的列的数据类型为Image,我想将图像存储为每个扫描文档的数组。这是我的代码,将数据保存到sql Server数据库中。
浏览按钮代码:
private void btnbrowseFiles_Click(object sender,EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "image files|*.jpg;*.png;*.gif;*.icon;*.bmp;*.*";
DialogResult dResult = fileDialog.ShowDialog();
if (dResult == DialogResult.OK)
{
pBoxVehicleDocument.Image = Image.FromFile(fileDialog.FileName);
}
}
private void btnAdd_Click(object sender,EventArgs e)
{
string documentName,vehicleId;
documentName = txtDocumentName.Text;
vehicleId = lblVehicleId.Text;
MemoryStream mStream = new MemoryStream();
pBoxDocument.Image.Save(mStream,System.Drawing.Imaging.ImageFormat.Jpeg);
mStream.ToArray();
//The documentName,vehicleId and imageArray to be passed to AddVehicleDocuments Method within Vehicles Class.
//No I am getting invalid arguments exception on AddVehicleDocuments() method.
Vehicles.AddVehicleDocuments(documentName,vehicleId,imageArray);
}
最后是Vehicles类中的AddVehicleDocuments方法代码:
public static void AddVehicleDocuments(string documentName,int vehicleId,byte[] imageString)
{
string query = string.Format("insert into tblDocuments values ('{0}',{1},{3})",documentName,imageString);
DataAccess.Execute(query);
}
现在,以下代码用于图像选择。我不确定如何将数组值从数据库转换回Windows窗体上的图片框:
private void childDocumentDetails_Load(object sender,EventArgs e)
{
int documentId = Convert.ToInt32(lblDocumentId.Text);
DaTarow dr = Vehicles.GetDocumentDetailsById(documentId);
txtDocumentName.Text = dr["DocumentName"].ToString();
txtVehicleNo.Text = dr["VehicleNo"].ToString();
//here the image array from the database will locate in dr["VehicleDocument"];
pBoxDocument.Image = //Need to write my code here
}
DaTarow dr包含给定文档的所有三个记录,即DocumentName,VehicleNo / VehicleID和字节字符串,但是Picture Box控件仍然不显示目标图像。在这方面只需要一些专家建议即可。
我们将不胜感激任何帮助。
解决方法
因为根据我的研究,我确定SQL Server-Side上的Image数据类型将对我有用,以便为车辆存储扫描的文档。但是,我后来修改了代码,并使用Verbinary(MAX)作为用于在数据库中存储图像的数据类型。
我修改了插入代码,现在看起来像这样:
private void btnAdd_Click(object sender,EventArgs e)
{
string documentName,vehicleId;
documentName = txtDocumentName.Text;
vehicleId = lblVehicleId.Text;
MemoryStream mStream = new MemoryStream();
pBoxDocument.Image.Save(mStream,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imagesBytes = mStream.ToArray();
Vehicles.AddVehicleDocuments(documentName,vehicleId,imagesBytes);
}
图像选择代码如下:
private void childDocumentDetails_Load(object sender,EventArgs e)
{
int documentId = Convert.ToInt32(lblDocumentId.Text);
DataRow dr = Vehicles.GetDocumentDetailsById(documentId);
txtDocumentName.Text = dr["DocumentName"].ToString();
txtVehicleNo.Text = dr["VehicleNo"].ToString();
byte[] imageString = (byte[]dr["VehicleDocument"]);
MemoryStream mStream = new MemoryStream(imageString);
pBoxDocument.Image = Image.FromStream(mStream);
}
感谢@Jimi建议修改代码。