Получение изображения с SQL Server - PullRequest
0 голосов
/ 11 февраля 2012

Я написал этот код, но столкнулся с исключением, которое говорит: Parameter Not Valid.

    string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True";

    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = connstr;

    conn.Open();

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;

    cmd.CommandText = "SELECT * FROM tbl";

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;

    DataTable dt = new DataTable();
    da.Fill(dt);

    byte[] barrImg = (byte[])dt.Rows[1]["image"];

    MemoryStream mstream = new MemoryStream();

    mstream.Write(barrImg, 0, barrImg.Length);
    mstream.Seek(0, SeekOrigin.Begin);

    img.Image = Image.FromStream(mstream);
    mstream.Close();

Исключение составляет:

Parameter is not valid.

в строке кода Image.FromStream.

Я проверил значение, которое в datatable было присвоено полю изображения. Это было System.Byte[]. Я проследил код. Кажется, все правильно. Но это не работает.

Я искал эту проблему. Другой сайт предпочел установить mstream.Position = 0. Но это не работает.

Я сохранил свое изображение под этим кодом. Если возможно, что я сохранил это неправильно!

    string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True";

    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = connstr;

    conn.Open();

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;

    string sql = "INSERT INTO tbl (name, family, image) VALUES ('name', 'family', '{0}')";
    sql = string.Format(sql, Image.FromFile("test.jpg"));

    cmd.CommandText = sql;
    cmd.ExecuteNonQuery();
    conn.Close();

новый код для сохранения изображения:

public byte[] ReadFile(string sPath)
{
    byte[] data = null;


    FileInfo fInfo = new FileInfo(sPath);
    long numBytes = fInfo.Length;

    FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);

    BinaryReader br = new BinaryReader(fStream);

    data = br.ReadBytes((int)numBytes);

    return data;
}

и:

private void cmdSave_Click(object sender, EventArgs e)
{
    string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True";

      byte[] imageData = ReadFile("test.jpg");

      SqlConnection CN = new SqlConnection(connstr);

      string qry = "insert into tbl (name, family, image) VALUES ('name', 'family', '{0}')";
      qry = string.Format(qry, imageData);

      SqlCommand SqlCom = new SqlCommand(qry, CN);

      CN.Open();
      SqlCom.ExecuteNonQuery();
      CN.Close();
}

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Хм, это не сработает.

Ваш код, который «хранит» изображение, ну, на самом деле, не делает то, что вы думаете.

Он помещает значение "test.jpg" в поле изображения. Это не двоичные данные изображения; только имя файла .

Итак, когда вы идете, чтобы вытащить его обратно, вызов Image.FromStream(mstream) приведет к тому, что значение "test.jpg" не будет изображением .. ergo: параметр недопустим

Вот пример того, что вам нужно сделать, чтобы фактически поместить изображение в базу данных:

http://www.codeproject.com/Articles/21208/Store-or-Save-images-in-SQL-Server

1 голос
/ 11 февраля 2012

Вы закрываете поток, затем пытаетесь извлечь изображение из потока, поэтому ошибка «не может получить доступ к закрытому потоку».

Попробуйте поменять местами порядок последних двух строк:

img.Image = Image.FromStream(mstream);
mstream.Close();
0 голосов
/ 11 февраля 2012
using (MemoryStream mstream = new MemoryStream((byte[])dt.Rows[1]["image"]))
{
    img.Image = Image.FromStream(mstream);
}

Упростил бы вещи.Я подозреваю, что ваша проблема заключается в том, что вам нужно вызвать mStream.Flush () после записи и перед поиском.

Чтобы поместить изображение в базу данных, один из способов:

string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True";

using(SqlConnection conn = new SqlConnection(connstr))
{
  using (SqlCommand comm = new SqlCommand(conn))
  {
    comm.CommandText = "INSERT INTO tbl (name, family, image) VALUES (@name,@family,@Content)";
    comm.Parameters.Add(new SqlParameter("name",DbType.String,"Fred"));
    comm.Parameters.Add(new SqlParameter("family",DbType.String,"Flintstone"));
    using(FileStream fs = new FileStream("FredWilmaBamBamAndDino.jpg",FileMode.Open,FileAccess.Read))
    {
      comm.Parameters.Add(new SqlParameter("content",DbType.Image,fs));
    }
    cmd.ExecuteNonQuery();
  }
}

Обратите внимание, что он помещает содержимое файла в базу данных.Поскольку в случае с jpg этот контент определенно не является строкой, используйте параметризованный запрос.Что ты должен делать в любом случае, выработать хорошую привычку.Вам также нужно разобраться, используя ваш код, утечка ресурсов повсюду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...