C#从数据库中检索图像

时间:2018-07-27 08:53:37

标签: c# sql-server image

几周来我一直在研究这个应用程序。用户的希望之一是保存并显示图像。因此,我为用户创造了插入屏幕快照的机会。但是,当我第一次将图像发送到数据库并再次检索它们时,就无法再将它们解码为图像。 (错误:该参数无效。)因此,我检查了该代码还是其他代码。我发现,将图像转换为byte []之后,我可以还原并显示该图像而没有任何麻烦。因此,问题出在写入数据库和再次取回数据库之间。我查看了数据库,发现每个图像都以0x开头,即使没有图像要上传。我读到一些有关某些数据库的信息,可能会添加标头,所以我猜这就是问题所在。但是现在我需要知道如何摆脱该标头。而且,如果我放弃了该阅读器,是否仍可以仅使用GetValue()函数,还是真的需要使用GetBytes()?我之所以没有使用GetBytes的原因是,我需要在开始时分配一个长度,但是每个图像的长度都会变化。

有人能告诉我如何删除标头吗?我检查了前几个字节的值,希望如果我删除前两个字节,它们代表0x并且问题可以解决,但这显然不是这样的。之后,我尝试将图片上传到db并再次检索它,我注意到长度从566到1335。但是空白图片,尽管db表示其中包含0x,但具有byte []和长度为0。

对象bsk将发送到一部分代码,并将其写入数据库:

 String command = "INSERT INTO " + db.getTabelbsk() + " VALUES ('" + bsk.getEmailapplicant() + "','" + bsk.getCreation().ToString("MM-dd-yyyy") + "','" + bsk.getCrmQuoteNumber()
            + "','" + bsk.getProjectStage() + "','" + bsk.getRefArticleId() + "','" + bsk.getClassification() + "','" + bsk.getDescription() + "','" +
            bsk.getTrackingnumber() + "','" + bsk.getLastModified().ToString("MM-dd-yyyy") + "','" + bsk.getStatus() + "','" + bit + "','" + bsk.getScr() + "','" +
            bsk.getBskMail() + "','" + bsk.getEnd12Mail() + "','" + bsk.getEnd3elecMail() + "','" + bsk.getEnd3swMail() + "','" + bsk.getPrmMail() + "','" +
            bsk.getRejectMail() + "','" + bsk.getRejectReason() + "','" + bsk.getCommercialDescription() + "','" + bsk.getTechnicalDescription() + "','" +
            bsk.getValue() + "','" + bsk.getEndhours() + "', '" + bsk.getLockedBy() + "', '";

        command = addImages(command, bsk.getSrcSs()) + "', '" + addImages(command, bsk.getTechnicalDescriptionSs()) + "');";

        sqlcommand(con, command);

    private String addImages(String command, byte[] ba)
    {                  //Adds every byte to the command String
        foreach (byte b in ba)
        {
            command += b;
        }
        return command;
    }

    public SqlDataReader sqlcommand(SqlConnection con, String s)
    {                          //Executes the command
        try
        {
            con.Close();
        }
        catch { }
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.CommandText = s;
        cmd.Connection = con;

        try
        {
            con.Open();
        }
        catch
        {

        }
        SqlDataReader reader = cmd.ExecuteReader();
        return reader;
    }

这部分用于从数据库中检索数据:

public Bsk returnBsk(Database db, Bsk bsk, SqlConnection con)
    {        //This will retrieve the data from the database
        String table = db.getTabelbsk();
        int trackingnumber = bsk.getTrackingnumber();
        String command = "SELECT * FROM " + table + " WHERE trackingNumber = " + trackingnumber;
        SqlDataReader reader = sqlcommand(con, command);

        reader.Read();         //Filling the object with data
        bsk.setEmailapplicant(reader.GetString(0));
        bsk.setCreation(reader.GetDateTime(1));
        bsk.setCrmQuoteNumber(reader.GetString(2));
        bsk.setProjectStage(reader.GetString(3));
        bsk.setRefArticleId(reader.GetString(4));
        bsk.setClassification(reader.GetString(5));
        bsk.setDescription(reader.GetString(6));
        bsk.setLastModified(reader.GetDateTime(8));
        bsk.setStatus((Bsk.Status)Enum.Parse(typeof(Bsk.Status), reader.GetString(9)));
        if (reader.GetBoolean(10) == false)
        {
            bsk.setComplexity((Bsk.Complexity.Simple));
        }
        else if (reader.GetBoolean(10) == true)
        {
            bsk.setComplexity((Bsk.Complexity.Complex));
        }
        bsk.setScr(reader.GetString(11));
        bsk.setBskMail(reader.GetString(12));
        bsk.setEnd12Mail(reader.GetString(13));
        bsk.setEnd3elecMail(reader.GetString(14));
        bsk.setEnd3swMail(reader.GetString(15));
        bsk.setPrmMail(reader.GetString(16));
        bsk.setRejectMail(reader.GetString(17));
        bsk.setRejectReason(reader.GetString(18));
        bsk.setCommercialDescription(reader.GetString(19));
        bsk.setTechnicalDescription(reader.GetString(20));
        bsk.setValue(reader.GetInt32(21));
        bsk.setEndhours(reader.GetInt32(22));
        bsk.setLockedBy(reader.GetString(23));
        if (!Convert.IsDBNull(reader.GetValue(24)))
        {
            bsk.setSrcSs((byte[])reader.GetValue(24));
        }
        if (!Convert.IsDBNull(reader.GetValue(25)))
        {
            bsk.setTechnicalDescriptionSs((byte[])reader.GetValue(25));
        }
        reader.Close();
        con.Close();
        return bsk;
    }

图像到字节[]:

Image imageSrc = pb_Src.Image;
byte[] arrSrc;
ImageConverter converterSrc = new ImageConverter();
arrSrc = (byte[])converterSrc.ConvertTo(imageSrc, typeof(byte[]));
bsk.setSrcSs(arrSrc);

byte []到图像:

byte[] arrSrc = bsk.getSrcSs();
MemoryStream ms = new MemoryStream(arrSrc);
pb_Src.Image = Image.FromStream(ms);    <-- Error message appears here

PS: 我知道How to display image from database in c#是相关的。但是,这个问题从未得到解答。

0 个答案:

没有答案