首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

数据库图片字段直接用SQL语句插入二进制数据,为啥有不对的呢?解决思路

2012-01-21 
数据库图片字段直接用SQL语句插入二进制数据,为啥有不对的呢???????数据库:sql server 2005操作方法:直接

数据库图片字段直接用SQL语句插入二进制数据,为啥有不对的呢???????
数据库:sql server 2005
操作方法:直接用insert向数据库图片字段插入二进制数据

故障现象:

一共用insert插了13个数据,可是其中一个就是不正常

现象为insert插入语句中本来是"0x89504E470D0A1A0A0000000D4948……(省略若干)"
可是完后再select出来中却变为"0x089504E470D0A1A0A0000000D494……(省略若干)"

这就导致了我在程序中读取改行数据显示为图片时程序出错。。。
不知道那个0是怎么多出来的,整体长度没变,第三位多个0,后面整体右移了一位,再截断了最后那一位

二进制数据是我先在程序中,利用程序插入数据库,然后再select出来,复制到insert语句中的。

有一个现象是,这副图的二进制数据比另外12个都长。

[解决办法]

C# code
ReadImage.aspx.csusing System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Data.SqlClient;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace eMeng.Exam.DataGridShowImage{  /// <summary>  /// ReadImage 的摘要说明。  /// </summary>  public class ReadImage : System.Web.UI.Page  {  private void Page_Load(object sender, System.EventArgs e)  {   // 在此处放置用户代码以初始化页面   string strImageID = Request.QueryString["id"];   SqlConnection myConnection = new SqlConnection("Data Source=.;Initial Catalog=mxh;User Id=sa;Password=;");   SqlCommand myCommand = new SqlCommand("Select PersonImageType, PersonImage from Person Where PersonID="     + strImageID, myConnection);   try   {    myConnection.Open();    SqlDataReader myDataReader;    myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);    if(myDataReader.Read())    {     Response.Clear();     Response.ContentType = myDataReader["PersonImageType"].ToString();     Response.BinaryWrite((byte[])myDataReader["PersonImage"]);    }    myConnection.Close();   }   catch (SqlException SQLexc)   {   }   Response.End();  }    #region Web Form Designer generated code    override protected void OnInit(EventArgs e)    {      //      // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。      //      InitializeComponent();      base.OnInit(e);    }            /// <summary>    /// 设计器支持所需的方法 - 不要使用代码编辑器修改    /// 此方法的内容。    /// </summary>    private void InitializeComponent()    {          this.Load += new System.EventHandler(this.Page_Load);    }    #endregion  }}
[解决办法]
lz参考下 图片转成2进制 放入数据库 asp.net 上
C# code
        protected void Button1_Click(object sender, EventArgs e)        {            if (FileUpload1.PostedFile.FileName != "")            {                string name = FileUpload1.PostedFile.FileName;                string type = name.Substring(name.LastIndexOf(".") + 1);                FileStream fs = File.OpenRead(name);                byte[] content = new byte[fs.Length];                fs.Read(content, 0, content.Length);                fs.Close();                SqlConnection con = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);                SqlCommand cmd = con.CreateCommand();                con.Open();                cmd.CommandText = "insert into test(image_data) values (@image_data)";                cmd.CommandType = CommandType.Text;                if (type == "jpg" || type == "gif" || type == "bmp" || type == "png")                {                    SqlParameter para = cmd.Parameters.Add("@image_data", SqlDbType.Image);                    para.Value = content;                    cmd.ExecuteNonQuery();                    Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('上传成功!')</script>");                }            }            else { Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('请选择图片类型的文件!')</script>"); }        } 


[解决办法]
以前做 图片上传时 上传BMP文件 只有400多k 它上传不能 转成 jpg 它就能传了。。不知道是什么原因 十分奇怪
[解决办法]
代码看不出问题。。奇怪。。。
[解决办法]
俺也遇到这样的问题,学习关注
[解决办法]
我也遇过类似的问题,直接二进制insert有问题,但如果从其他记录update过去,又没有问题.
如果你有图片,可否考虑用openrowset插入图片

SQL code
Update FaceValue    Set binary_data = (select binary_data From OPEMROWSET( BULK 'C:\temp\bfile01.jpg',SINGLE_BLOB) As F(binary_data))
[解决办法]
兴许是图片问题

把图片PS一下,如加个小点上去(几乎看不到的小点).然后另存图片再导进,就知道是不是图片问题了
[解决办法]
1. 在存入库之前对数据转义;
2. 存大量二进制数据,不要用Insert Into,因为SQL语句有长度限制,C++里用PutCollect,C#我不懂,自己找
[解决办法]
检查一下数据库的字符集吧,可能是这个的问题..;
[解决办法]
DEBUG追踪一下或者把"0x???????"换成byte[]来看看
你可能会有新发现
[解决办法]
同意 三十九楼的意见 我也遇到过 这问题 不要直接用 insert 语句插入 可以定义参数 仿照 八楼 的写 就不会出错了

热点排行