从wcf服务获取图像并将其放入表中的SQL Server查询

时间:2015-06-21 18:23:22

标签: c# sql-server image wcf

程序员如何能够从wcf服务向SQL Server数据库添加图像?

这是实现从wcf服务添加图像的代码:

    public static void StoreImageIntoDB(string imagePath)
    {
        string connectionString = "server=XXXX.XXXX.XXXX.XXXX;uid=sa;password=XXXXXX;database=XXXXXX;";

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            string sql = "insert into ImageTable values (@img)";
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.ReadWrite);
                byte[] imageBytes = new byte[fs.Length];
                fs.Read(imageBytes, 0, Convert.ToInt32(fs.Length));
                fs.Dispose();

                cmd.Parameters.Add("@img", SqlDbType.Image).Value = imageBytes;
                cmd.ExecuteNonQuery();
            }
        }
    }

    public static void RetrieveImageFromDB()
    {
        string connectionString = "server=XXXX.XXXX.XXXX.XXXX;uid=sa;password=XXXXXX;database=XXXXXX;";

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            string sql = "select * from ImageTable";
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                DataSet set = new DataSet();

                adapter.Fill(set);

                foreach (DataRow row in set.Tables[0].Rows)
                {
                    byte[] imageBytes = row[1] as byte[];
                    MemoryStream ms = new MemoryStream(imageBytes);
                    Image image = Image.FromStream(ms);
                    image.Save(string.Format(@"D:\{0}.jpg", row[0].ToString()));//Save the image to disk
                    image.Dispose();
                    ms.Dispose();
                }
            }
        }
    }

现在我需要知道如何在SQL服务器中实现它。我假设这是一个查询,但不知道从哪里开始。

1 个答案:

答案 0 :(得分:2)

我在几个级别上对象 - 表需要主键和其他控制数据。这种设计存在严重缺陷,但考虑到我们被告知的代码按预期工作,问题的答案将是

CREATE TABLE  ImageTable ( ImageBinary VARBINARY(MAX) )

我建议你阅读TSQL DDL(参考https://msdn.microsoft.com/en-us/library/ff848799.aspx),或许会得到一本关于数据库设计的书。

更好的是更像

CREATE TABLE  ImageTable (  ImageID     INT IDENTITY PRIMARY KEY
                        ,   ImageBinary VARBINARY(MAX) 
                        ,   Added       DATETIME DEFAULT GETDATE()
                        )

会将您的插入内容更改为

string sql = "insert into dbo.ImageTable( ImageBinary ) values (@img)";

和您的检索

string sql = "select ImageBinary from dbo.ImageTable";

但是现在你有一个主键,如果你想一次想要一个图像或者能够删除一个图像,你可以将检索限制在一个日期范围内或按升序或降序排列。