Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET
Moderator: mikey
Tym
Posty: 26 Rejestracja: 05 kwie 2019, 09:32
Rola: Inny
Wersja: 2019
Post
autor: Tym » 22 cze 2020, 13:46
Chciałbym pobrać plik zapisany w bazie Comarcha swoim programem, a więc albo bezpośrednio z bazy, albo poprzez API. Pliki na których mi zależy, to skany w PDFie, do których w Comarchu docieram w następujący sposób: Księgowość > Rejestry VAT > tam wyszukuję fakturę sprzedaży i otwieram jej podgląd. W API nie widzę funkcji, która by mogła to wykonać, dlatego spróbowałem pobrać plik bezpośrednio z bazy danych, załączam kod:
Kod: Zaznacz cały
byte[] plik_bin = SQL.GetBinaryFile(id_pliku);
string ścieżka = Path.GetTempPath() + id_pliku + ".pdf";
try
{
File.WriteAllBytes(ścieżka, plik_bin);
}
Niestety tak pobrany plik nie działa, nie da się go otworzyć i wyskakuje taka informacja:
A więc moje pytania są następujące: Czy istnieje lepszy sposób na pobranie tych plików z Comarcha? Czy może te pliki są jakoś specjalnie kompresowane/szyfrowane i trzeba coś z nimi więcej robić przy bezpośrednim pobieraniu z bazy danych?
rolski95
Posty: 101 Rejestracja: 21 lut 2019, 08:24
Rola: Administrator CDN XL
Post
autor: rolski95 » 22 cze 2020, 16:24
U mnie poniższy kod pobiera pliki PDF beż żadnego problemu. Jest on analogiczny do twojego więc gdzieś indziej musi być problem
Kod: Zaznacz cały
var DABITEM= context.DaneBinarne.Where(x => x.DAB_ID == Convert.ToInt32(item.Name)).FirstOrDefault();
System.IO.File.WriteAllBytes(folderPath + DABITEM.DAB_Nazwa + "." + DABITEM.DAB_Rozszerzenie, DABITEM.DAB_Dane);
viesiek1
Posty: 416 Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:
Post
autor: viesiek1 » 22 cze 2020, 18:11
Może trzeba rozpakować? Nie mam pewności czy mój kod rozpakuje dane binarne z XL, ale może warto spróbować. Usuń wcześnej, to co niepotrzebne
Kod: Zaznacz cały
private void GetBinaryDataFormDb()
{
try
{
StringBuilder lSb = new StringBuilder();
if (fOlvMain.SelectedIndices.Count > 0)
{
this.Cursor = Cursors.WaitCursor;
int lIndex = gBinaryFileList.IndexOf((BinaryFile)fOlvMain.SelectedObject);
lSb.AppendLine("SELECT");
lSb.AppendLine(" BD.BinaryData AS BinaryData");
lSb.AppendLine(" , ISNULL(BD.Name,'') AS Name");
lSb.AppendLine("FROM BinaryData AS BD");
lSb.AppendLine("WHERE BD.Id = " + gBinaryFileList[lIndex].Id);
using (SqlConnection lConnection = new SqlConnection(Global.gvConnectionStringEshops))
{
try
{
using (SqlCommand lCommand = new SqlCommand())
{
lCommand.Connection = lConnection;
if (lConnection.State != ConnectionState.Open)
lConnection.Open();
lCommand.CommandText = lSb.ToString();
lCommand.CommandTimeout = 600;
using (SqlDataReader lReader = lCommand.ExecuteReader())
{
try
{
if (lReader.HasRows)
{
while (lReader.Read())
{
if ((lReader["BinaryData"]) != DBNull.Value)
{
byte[] lByte = new byte[0];
lByte = (Byte[])(lReader["BinaryData"]);
if (lByte.Length > 0)
{
byte[] lByteDeComp = new byte[0];
lByteDeComp = Global.DecompressSQL(lByte);
if (lByteDeComp.Length > 0)
{
if (Path.GetExtension(lReader["Name"].ToString().ToUpper()) == ".JPG")
{
if (pdfViewer.Document != null)
{
pdfViewer.Document = null;
pdfViewer.Visible = false;
}
ImageConverter lConverter = new ImageConverter();
pictureBoxPreview.Image = (Image)lConverter.ConvertFrom(lByteDeComp);
pictureBoxPreview.SizeMode = PictureBoxSizeMode.StretchImage;
labelImageSize.Text = "Rozmiar obrazka: " + pictureBoxPreview.Image.Width + " x " + pictureBoxPreview.Image.Height;
if (pictureBoxPreview.Image.Width < 200 | pictureBoxPreview.Image.Height < 200)
{
labelImageSize.BackColor = Color.Red;
labelImageSize.ForeColor = Color.Yellow;
}
else
{
labelImageSize.BackColor = SystemColors.Control;
labelImageSize.ForeColor = SystemColors.ControlText;
}
}
else
{
pictureBoxPreview.Image = null;
labelImageSize.Text = "Rozmiar obrazka:";
labelImageSize.BackColor = SystemColors.Control;
labelImageSize.ForeColor = SystemColors.ControlText;
if (Path.GetExtension(lReader["Name"].ToString().ToUpper()) == ".PDF")
{
pdfViewer.Visible = true;
using (MemoryStream lStream = new MemoryStream(lByteDeComp))
{
pdfViewer.Document = PdfDocument.Load(lStream);
lStream.Close();
}
}
}
}
}
}
}
}
}
finally
{
if (!lReader.IsClosed)
lReader.Close();
}
}
}
}
finally
{
if (lConnection.State != ConnectionState.Closed)
lConnection.Close();
}
}
}
this.Cursor = Cursors.Default;
}
catch (Exception ex)
{
this.Cursor = Cursors.Default;
string lClassName = System.Reflection.MethodBase.GetCurrentMethod().Name;
MessageBox.Show("Błąd: " + lClassName + ", " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public static byte[] DecompressSQL(byte[] data)
{
using (var output = new MemoryStream())
{
using (var input = new MemoryStream())
{
input.Write(data, 0, data.Length);
input.Position = 0;
using (var gzip = new GZipStream(input, CompressionMode.Decompress, true))
{
var buff = new byte[64];
var read = gzip.Read(buff, 0, buff.Length);
while (read > 0)
{
output.Write(buff, 0, read);
read = gzip.Read(buff, 0, buff.Length);
}
gzip.Close();
}
return output.ToArray();
}
}
}
Tym
Posty: 26 Rejestracja: 05 kwie 2019, 09:32
Rola: Inny
Wersja: 2019
Post
autor: Tym » 30 cze 2020, 10:00
Dziękuję bardzo Panu viesiek1, dekompresja gzipem okazała się elementem, którego u mnie brakowało, po dodaniu tego PDFy pobierane z bazy XLa już poprawnie się otwierają
viesiek1
Posty: 416 Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:
Post
autor: viesiek1 » 30 cze 2020, 10:26
To dobrze, bo nie byłem pewien. Ale "Pan", to już nie był potrzebny