我有一个程序来选择图像并在图片框中设置所选图像,然后将图像框中的图像转换为字节数组,并将sql server数据库保存在图像类型列中。
在浏览按钮点击事件中,我选择了这样的图像文件。
OpenFileDialog fop = new OpenFileDialog();
fop.InitialDirectory = @"Desktop";
fop.Filter = "image files|*.jpg;*.png;*.gif";
if (fop.ShowDialog() == DialogResult.OK)
{
FileStream FS = new FileStream(@fop.FileName, FileMode.Open, FileAccess.Read);
pbPartySymbol.Image = new Bitmap(fop.FileName);
MessageBox.Show("Image Imported Successfully!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
选择图像并将其设置为图片框图像后,我将保存按钮单击事件中的图片框图像转换为字节数组,并将字节数组保存到数据库中。
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
我正在调用这样的方法。
byte[] myArr1 = imageToByteArray(pbPartySymbol.Image);
我将这个字节数组传递给数据库。它也节省了。但 ALL 添加的图像保存如下。* 0x53797374656D2E427974655B5D *保存的图像无法在读取操作中返回到图片框。我在 SAVING 中做错了什么?
这是我在表单中保存操作时所做的工作。
Party ptObj = new Party(myArr1);
if (new PartyOP().saveParty(ptObj))
{
MessageBox.Show("NEW data added");
}
在我的业务操作层中,这是我的代码。
public Boolean saveParty(Party ptObj)
{
string query1 = "EXEC insertToParty'" + ptObj.PTSymARR + "'";
return (new DataAccessLayer().executeNonQueries(query1));
}
这是我如何在Party类中设置属性。
class Party
{
public Party() { }
public Party(byte[] ptSym)
{
this._PTSymARR = ptSym;
}
public byte[] PTSymARR
{
get { return _PTSymARR; }
set { _PTSymARR = value; }
}
}
这是我的存储过程。 CREATE PROCEDURE insertToParty ( @ptSymbol图片 ) 如 开始 开始交易 设置NOCOUNT ON; --query 插入党(PTSYM) 价值观(@ptSymbol);
PTSYM的数据类型是图像数据类型。
答案 0 :(得分:2)
该十六进制字符串转换为System.Byte[]
。
将Byte-Array添加到以EXEC insertToParty
开头的字符串中,以便.Net假定您需要该变量的字符串表示形式。除非指定它调用.ToString给你....“System.Byte []”。
编辑:您的存储过程不会在插入时使用十六进制编码。在SQL Studio等中查看时,image
数据以十六进制显示。
如果您在插入和解码时使用base64或hex将字节数组编码为字符串,那么在读取数据时您只需要担心增加的存储空间,但我建议您从动态SELECT更改数据库访问准备好参数的声明:
SqlCommand command = new SqlCommand("Exec InsertToParty(@blob)");
command.Parameters.AddWithValue("@blob", ptObj.PTSymARR);
command.ExecuteNonQuery();