【问题标题】:Upload image to SQL Database将图像上传到 SQL 数据库
【发布时间】:2013-08-02 10:16:00
【问题描述】:

我一直在寻找解决方案,但不知道我哪里做错了。但我是第一次这样做。

我有一个班级学生

class Students
{

    public Image photo { get; set; }


    public bool AddStudent(Students _student)
    {
        Settings mySettings = new Settings();

        SqlCeConnection conn = new SqlCeConnection(mySettings.StudentsConnectionString);
        SqlCeCommand cmd = new SqlCeCommand();
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.Connection = conn;
        cmd.CommandText = "insert into students (firstname, lastname, dob, allergic, allergydetails, memo, address, photo) " +
                            "Values (" +
                            "'" + @FirstName + "'," +
                            "'" + @LastName + "'," +
                            "'" + @Dob + "'," +
                            "'" + @isAllergic + "'," +
                            "'" + @AllergyDetails + "'," +
                            "'" + @Memo + "'," +
                            "'" + @photo + "'," +
                            "'" + @Address + "')";

        cmd.Parameters.Add("@FirstName", _student.FirstName);
        cmd.Parameters.Add("@LastName", _student.LastName);
        cmd.Parameters.Add("@Dob", _student.Dob);
        cmd.Parameters.Add("@isAllergic", _student.isAllergic);
        cmd.Parameters.Add("@AllergyDetails", _student.AllergyDetails);
        cmd.Parameters.Add("@Memo", _student.Memo);


        cmd.Parameters.Add("@photo", _student.photo);

        cmd.Parameters.Add("@Address", _student.Address);

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
            return false;
        }
        finally
        {
            if (conn.State == System.Data.ConnectionState.Open) conn.Close();
            cmd = null;
        }
    }  

现在我像这样从表单中传递属性值。

  private void btnAdd_Click(object sender, EventArgs e)
        {

            Students myStudent = new Students();

            myStudent.FirstName = txtFirstName.Text.Trim();
            myStudent.LastName = txtLastName.Text.Trim();
            myStudent.Dob = dtPicker1.Value;
            myStudent.Memo = txtMemo.Text.Trim();
            myStudent.Address = txtAddress.Text.Trim();

            myStudent.photo = Image.FromFile(openFileDialog1.FileName);

            // Insert New Record
            if (myStudent.AddStudent(myStudent))
                MessageBox.Show("Student Added Successfully");


        }

我收到以下错误

不存在从 DbType System.Drawing.Bitmap 到已知的映射 SqlCeType。

但我不知道为什么我没有成功。任何建议将不胜感激。

【问题讨论】:

  • 你需要把你的图片转换成一个字节[],然后它可以存储在一个图片数据类型msdn.microsoft.com/en-us/library/ms172424.aspx
  • 根据我的经验,这样做已经有一段时间了...您应该在数据库中使用 BLOB 字段,并将图像流式传输到字节数组,然后再将其放入 BLOB 字段中。
  • 你不明白,我的问题不一样。我首先将照片保存在类实例中,然后将其上传到数据库。在该实例中,我没有 openfiledialog.filename 等功能。
  • 确实可以将图像上传到 MS 数据库,但请确保图像质量低(缩略图),因为它会减慢您的数据库。将图像存储在服务器上,并将图像的路径作为字符串放入数据库中以加载图像。
  • 好评。谢谢,我会记住这一点。但是如果我使用 SQL Compact CE 会有什么不同吗?我现在收到异常不支持转换。 [要转换的类型(如果知道)= nvarchar,要转换的类型(如果知道)= binary]

标签: c# sql sql-server-ce


【解决方案1】:

尝试将图像转换为Byte[]数组,然后保存。

 private void btnAdd_Click(object sender, EventArgs e)
 {
    Students myStudent = new Students();
    ...
    ...
    // change the student photo to byte array e.g. 
    // public byte[] Photo {get;set;}
    myStudent.photo = imageToByteArray(Image.FromFile(openFileDialog1.FileName));
    ...
    ...
    // Insert New Record
    if (myStudent.AddStudent(myStudent))
    MessageBox.Show("Student Added Successfully");
 }

 // convert image to byte array
 public byte[] imageToByteArray(System.Drawing.Image imageIn)
 {
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
    return  ms.ToArray();
 }

//Byte array to photo
public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}

注意:你在数据库中的DataType必须是image类型

【讨论】:

  • 您好,感谢您的帮助,但它根本不起作用。我在 cmd.executenonQuery() 上收到此错误消息。错误是这个“不支持转换。[要转换的类型(如果知道)= nvarchar,要转换的类型(如果知道)= image]”
  • 照片在数据库中的数据类型是什么?
【解决方案2】:

查看此链接..

http://www.codeproject.com/Articles/25956/Sending-Receiving-PictureBox-Image-in-C-To-From-Mi

你真的必须将图像存储在数据库中吗?

如果您只需将图像存储在文件夹中(将其上传到您的应用程序),然后将该图像的路径存储在数据库中的“Varchar”字段中,您就可以轻松完成这项任务。 我在网站上工作得更多,但我认为基础知识应该是一样的......

【讨论】:

  • 是的,我相信这是我现在应该做的事情。它是一个使用本地数据库的基于桌面的独立应用程序。所以我最好只存储该图像的位置。或者可以将该图像复制到我定义的文件夹中,因此即使用户从该位置删除图像,我们也会有一个副本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2013-05-15
相关资源
最近更新 更多