C# 使用c将映像保存到sql server 2012#
我的目标是将图像插入我的sql server数据库。 数据库中定义为varbinary(max)类型的图像列 但是当我执行命令时,Image列只包含字节数组中的第一个值 插入图像脚本:C# 使用c将映像保存到sql server 2012#,c#,sql,sql-server,sql-server-2012,C#,Sql,Sql Server,Sql Server 2012,我的目标是将图像插入我的sql server数据库。 数据库中定义为varbinary(max)类型的图像列 但是当我执行命令时,Image列只包含字节数组中的第一个值 插入图像脚本: public void InsertImage() { string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; Image img = Image.FromFile(@"D:
public void InsertImage()
{
string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
Image img = Image.FromFile(@"D:\MyProjects\Registry Biometrics Insight\FingerPrintImages\1_2.bmp");
byte[] arr;
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
arr = ms.ToArray();
}
DBLayer dblayer = new DBLayer(CS);
SqlParameter[] sqlParams = new SqlParameter[1];
sqlParams[0] = new SqlParameter("@Image", SqlDbType.VarBinary);
sqlParams[0].Value = arr;
dblayer.M_ExecuteSQLCommand("prc_Fingers_InsertImage", sqlParams);
}
ExecuteSQLCommand脚本:
public int M_ExecuteSQLCommand(string StoredProcedureName, SqlParameter[] Parameters)
{
SqlCommand comm;
try
{
using (SqlConnection conn = new SqlConnection(_P_ConnectionString))
{
comm = new SqlCommand();
comm.Connection = conn;
comm.CommandType = System.Data.CommandType.StoredProcedure;
comm.CommandText = StoredProcedureName;
comm.CommandTimeout = 0;
comm.Parameters.Clear();
for (int i = 0; i < Parameters.Length; i++)
{
comm.Parameters.Add( Parameters[i] );
}
conn.Open();
comm.ExecuteNonQuery();
return 1;
}
}
catch (Exception ex)
{
throw ex;
}
}
为什么我得到这个结果而不是保存字节数组中的所有值???您可能希望使用“Read”方法将流转换为字节数组
ms.Read(arr, 0, ms.Length);
我甚至会在将流读入数组之前声明“arr”字节数组的大小
arr = new byte[ms.length];
您可能还必须重置流指针,因为在Save方法之后,指针位于流的末尾:
ms.Seek(0, SeekOrigin.Begin);
最后的代码块将导致替换
arr = ms.ToArray();
与
ms.Rewind()在写入之后,转换为数组之前。下面是一个很好的例子,这可能与此相关:ms.Rewind()在visual studio 2012中不存在@EricJ.@Mohamad您现在可能想这样做,但以我的经验来看,从长远来看,这并不值得,特别是当您最终遇到存储数千个图像的情况时。随着时间的推移,数据库的大小将以指数级增长,这使得数据库备份和管理成为一个难题。相反,考虑将图像保存到文件系统,并简单地将路径存储到DB中的图像。
arr = ms.ToArray();
ms.Seek(0, SeekOrigin.Begin);
arr = new byte[ms.length];
ms.Read(arr, 0, ms.Length);