К сожалению, нет простого ответа, поскольку сериализатор не знает, что сериализовать для интерфейса. Я нашел более полное объяснение того, как обходиться это на MSDN
Это метод, который использует элемент управления FileUpload в asp.net:
byte[] buffer = new byte[fu.FileContent.Length];
Stream s = fu.FileContent;
s.Read(buffer, 0, buffer.Length);
//Then save 'buffer' to the varbinary column in your db where you want to store the image.
Я думаю, что этот действительный вопрос уже дан здесь. Я тоже попробовал. Моя проблема заключалась в простом редактировании изображений (от DevExpress). и вот как я его обошел:
Еще раз спасибо. Chagbert
Попробуйте этот метод. Он должен работать, когда поле, когда вы хотите сохранить изображение, имеет тип bytea
. Сначала он создает byte[]
для изображения. Затем он сохраняет его с помощью IDataParameter
типа binary
.
public static void PerisitImage(string path, IDbConnection connection)
{
using (var command = connection.CreateCommand ())
{
Image img = Image.FromFile (path);
MemoryStream tmpStream = new MemoryStream();
img.Save (tmpStream, ImageFormat.Png); // change to other format
tmpStream.Seek (0, SeekOrigin.Begin);
byte[] imgBytes = new byte[MAX_IMG_SIZE];
tmpStream.Read (imgBytes, 0, MAX_IMG_SIZE);
command.CommandText = "INSERT INTO images(payload) VALUES (:payload)";
IDataParameter par = command.CreateParameter();
par.ParameterName = "payload";
par.DbType = DbType.Binary;
par.Value = imgBytes;
command.Parameters.Add(par);
command.ExecuteNonQuery ();
}
}
DbType.Binary
обрабатывает varbinary(MAX)
, хотя подсказка подсказки говорит, что она ограничена 8000 байтами.
– Jon Seigel
16 December 2010 в 16:06
вы можете сохранить путь изображения в базе данных или сохранить изображение как BLOB (двоичный - массив байтов) .. это зависит от вашего случая, если ваше приложение является веб-приложением, а затем сохраните путь изображения намного лучше. Но если вы получили клиентское приложение, которое подключается к централизованной базе данных, вы должны сохранить его как двоичный.
Вы захотите преобразовать изображение в byte[]
в C #, а затем столбец базы данных будет varbinary(MAX)
. После этого он будет похож на сохранение любого другого типа данных .
Поскольку вы используете SQL, рекомендуете не использовать adhoc («написание операторов в строках»), особенно учитывая, что вы загружаете изображение.
ADO.NET может выполнять всю тяжелую работу сопоставление, экранирование и т. д.
Либо создайте хранимую процедуру, либо используйте SqlParameter для привязки.
Как говорят другие плакаты, используйте VARBINARY (MAX) в качестве типа хранилища - IMAGE разваливается.
//Arrange the Picture Of Path.***
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
string[] PicPathArray;
string ArrangePathOfPic;
PicPathArray = openFileDialog1.FileName.Split('\\');
ArrangePathOfPic = PicPathArray[0] + "\\\\" + PicPathArray[1];
for (int a = 2; a < PicPathArray.Length; a++)
{
ArrangePathOfPic = ArrangePathOfPic + "\\\\" + PicPathArray[a];
}
}
// Save the path Of Pic in database
SqlConnection con = new SqlConnection("Data Source=baqar-pc\\baqar;Initial Catalog=Prac;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("insert into PictureTable (Pic_Path) values (@Pic_Path)", con);
cmd.Parameters.Add("@Pic_Path", SqlDbType.VarChar).Value = ArrangePathOfPic;
cmd.ExecuteNonQuery();
***// Get the Picture Path in Database.***
SqlConnection con = new SqlConnection("Data Source=baqar-pc\\baqar;Initial Catalog=Prac;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("Select * from Pic_Path where ID = @ID", con);
SqlDataAdapter adp = new SqlDataAdapter();
cmd.Parameters.Add("@ID",SqlDbType.VarChar).Value = "1";
adp.SelectCommand = cmd;
DataTable DT = new DataTable();
adp.Fill(DT);
DataRow DR = DT.Rows[0];
pictureBox1.Image = Image.FromFile(DR["Pic_Path"].ToString());