none
在一个Database的实例中,如何存取一个“image”类型的字段? RRS feed

  • 问题

  • 各位前辈:

    在使用C#的时候,遇到一个问题想请教:

    在SQL中,使用SMO,在Server中建立一个“Database”,以及其下的“Table”。

    在“Table”中有一个“image”类型的字段,应该如何访问呢?

    其他的字段,都可以通过“INSERT”以及“UPDATE”来访问,而“image”字段应该如何访问呢?

    是应该使用“StoredProcedure”或者“UserDefinedFunction”吗?

    很郁闷!


    一派胡言
    2010年3月15日 9:36

答案

  • 你好!

    以前写了一个简单示例包含了保存与获取图片信息,应该对你有帮助。

    public void Save()
    {
        /*
        * CREATE TABLE sys_Images(
        * Id uniqueidentifier NOT NULL,
        * Images image NOT NULL,
        * Primary Key (Id))
        */
        string imgPath = @"D:\My Documents\My Pictures\CYWX_4016.jpg";
    
        using (SqlConnection conn = new SqlConnection(@"Data Source=XP01\SQLEXPRESS;Initial Catalog=X;Integrated Security=SSPI;"))
        {
            SqlCommand comm = conn.CreateCommand();
            comm.CommandText = "INSERT INTO sys_Images VALUES(@Id, @Images)";
            comm.Parameters.AddWithValue("@Id", Guid.NewGuid());
            comm.Parameters.AddWithValue("@Images", GetFileStream(imgPath));
            conn.Open();
            comm.ExecuteNonQuery();
        }
    }
    
    public byte[] GetFileStream(String fFilePath)
    {
        using (FileStream fileStream = new FileStream(fFilePath, FileMode.Open))
        {
            byte[] vals = new byte[(int)fileStream.Length];
            fileStream.Read(vals, 0, vals.Length);
            return vals;
        }
    }
    
    public void ShowImage()
    {
        using (SqlConnection conn = new SqlConnection(@"Data Source=XP01\SQLEXPRESS;Initial Catalog=X;Integrated Security=SSPI;"))
        {
            SqlCommand comm = conn.CreateCommand();
            comm.CommandText = "Select Id, Images FROM sys_Images";
            conn.Open();
    
            using (SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection))
            {
                while (dr.Read())
                {
                    byte[] buffer = (byte[])dr["Images"];
                    System.IO.MemoryStream meorystream = new System.IO.MemoryStream(buffer);
                    pictureBox1.Image = new System.Drawing.Bitmap(meorystream);
                    meorystream.Dispose();
                }
            }
        }
    }


    知识改变命运,奋斗成就人生!
    2010年3月16日 3:46
    版主

全部回复

  • 用带参数的sql,

    SqlCommand comm = conn.CreateCommand();

    comm.CommandText = "Insert into tb (id, image) Values (?, ?)";
    comm.Parameters.Add(new SqlParameter("@id", SqlDbType.Int32, 12345));
    comm.Parameters.Add(new SqlParameter("@image", SqlDbType.Binary, imagedata)); // 类型是 byte[]

    comm.ExecuteNonQuery();

    即可

    霸王
    2010年3月15日 9:43
  • 用 varbinary 数据类型访问。image 就是一个二进制序列。就像 nvarchar 和 text 一样,后者是前者的一个再定义。
    Mark Zhou
    2010年3月15日 9:44
  • 谢谢老大!

    您提到的这种方式,我已经了解。

    我特别想知道在使用“Database”这个类的实例时,如何访问“Table”中的“Image”字段。

    据说这需要用到“SMO”中的某些技术,我现在还不得其要领。


    一派胡言
    2010年3月16日 3:35
  • 你好!

    以前写了一个简单示例包含了保存与获取图片信息,应该对你有帮助。

    public void Save()
    {
        /*
        * CREATE TABLE sys_Images(
        * Id uniqueidentifier NOT NULL,
        * Images image NOT NULL,
        * Primary Key (Id))
        */
        string imgPath = @"D:\My Documents\My Pictures\CYWX_4016.jpg";
    
        using (SqlConnection conn = new SqlConnection(@"Data Source=XP01\SQLEXPRESS;Initial Catalog=X;Integrated Security=SSPI;"))
        {
            SqlCommand comm = conn.CreateCommand();
            comm.CommandText = "INSERT INTO sys_Images VALUES(@Id, @Images)";
            comm.Parameters.AddWithValue("@Id", Guid.NewGuid());
            comm.Parameters.AddWithValue("@Images", GetFileStream(imgPath));
            conn.Open();
            comm.ExecuteNonQuery();
        }
    }
    
    public byte[] GetFileStream(String fFilePath)
    {
        using (FileStream fileStream = new FileStream(fFilePath, FileMode.Open))
        {
            byte[] vals = new byte[(int)fileStream.Length];
            fileStream.Read(vals, 0, vals.Length);
            return vals;
        }
    }
    
    public void ShowImage()
    {
        using (SqlConnection conn = new SqlConnection(@"Data Source=XP01\SQLEXPRESS;Initial Catalog=X;Integrated Security=SSPI;"))
        {
            SqlCommand comm = conn.CreateCommand();
            comm.CommandText = "Select Id, Images FROM sys_Images";
            conn.Open();
    
            using (SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection))
            {
                while (dr.Read())
                {
                    byte[] buffer = (byte[])dr["Images"];
                    System.IO.MemoryStream meorystream = new System.IO.MemoryStream(buffer);
                    pictureBox1.Image = new System.Drawing.Bitmap(meorystream);
                    meorystream.Dispose();
                }
            }
        }
    }


    知识改变命运,奋斗成就人生!
    2010年3月16日 3:46
    版主
  • 数据库的存取的话,上面介绍的方法已经足够了(似乎也没其他方法了),不知道你的问题是在哪个环节?

    另外,你说的smo是啥?google的结果似乎是一种媒体组织方式,业务层的东西,应该跟数据层没有什么关系的吧。
    霸王
    2010年3月16日 5:27
  • 偶然发现这里还有一个sql smo/dmo专用论坛,也许你可以在那里找到答案

    http://social.msdn.microsoft.com/Forums/zh-CN/sqlsmoanddmo/threads

    霸王
    2010年3月16日 5:33