Marc-IT Ответов: 2

Crystal reports отображает изображение из SQL


Привет,

У меня есть приложение c# winform, которое хранит изображения в базе данных sql как "изображение".
Я могу хранить изображение просто отлично, но при печати отчета изображение не появляется.

Может кто-нибудь помочь, заранее спасибо.
Код, который я использую для хранения изображения и печати отчета, приведен ниже:

Что я уже пробовал:

// вставить изображение в SQL:
con.Open();
MemoryStream ms = new MemoryStream();
pictureBox2.Image.Save(ms, ImageFormat.Jpeg);
byte[] photo = new byte[ms.Length];
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into dbo.temp (maquete) VALUES ('" + Photo + "');
cmd.ExecuteNonQuery();
con.Close();
report report = new report();
report.ShowDialog();



//печатный отчет

con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from temp";
cmd.ExecuteNonQuery();
bdDataSet ds = new bdDataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds.temp);
hytherm myReport = new hytherm();
myReport.SetDataSource(ds);
crystalReportViewer1.ReportSource = myReport;
con.Close();

2 Ответов

Рейтинг:
18

Richard Deeming

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

На данный момент, используя конкатенацию строк, ваш окончательный запрос будет:

insert into dbo.temp (maquete) VALUES ('System.Byte[]')

Очевидно, что литеральная строка System.Byte[] не является допустимым массивом байтов.

(Массив байтов также пуст - вы объявляете его, но никогда не заполняете.)

Чтобы передать массив байтов вашему запросу, вы должны должен используйте параметр:
using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand("INSERT INTO dbo.temp (maquete) VALUES (@photo)", connection))
{
    using (var ms = new MemoryStream())
    {
        pictureBox2.Image.Save(ms, ImageFormat.Jpeg);
        byte[] photo = ms.ToArray();
        command.Parameters.AddWithValue("@photo", photo);
    }
    
    connection.Open();
    command.ExecuteNonQuery();
}


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


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


Marc-IT

Большое спасибо,это действительно работает.

Рейтинг:
1

$*Developer - Vaibhav*$

Храните и извлекайте изображения в Crystal Reports из базы данных SQL и папки с помощью ASP.Net[^]


tp://www.aspsnippets.com/Articles/Display-image-from-database-in-Crystal-Report-in-ASPNet-using-C-and-VBNet.aspx