PDA

View Full Version : سوال: نمایش فایل پی دی اف داخل بانک اطلاعاتی



forodo
سه شنبه 30 مهر 1392, 11:52 صبح
چطور می تونم فایل پی دی افی که داخل بانک اطلاعاتی هست رو نمایش بدم؟
مهم نیست که تو چه برنامه یا کنترلی نمایش داده بشه. فقط نمایش داده بشه کار من راه بیافته.

nafisehk
چهارشنبه 01 آبان 1392, 14:52 عصر
من یه فایل پی دی اف توی بانک اطلاعاتی اکسس به صورت بایت به بایت ذخیره کردم و حالا می خوام اونارو بخونم.
چطور می تونم اونو باز کنم و ببینم؟


شما میتونید نوع فایلی که میخواید و ذخیره کنید و با توجه به اون نوع ،فایل و نمایش بدید

نوع فایل


static string GetFileType(stringpath)

{

//بدست اوردننوع فایل



if(string.IsNullOrEmpty(Path.GetFileName(path)))

return"Folder";

stringext = Path.GetExtension(path);

RegistryKeymyRegistryKey = Registry.ClassesRoot.OpenSubKey(ext);

while(myRegistryKey != null)

{

stringName = (string)myRegistryKey.GetValue(null);

if(Name == null)

return ext + "File";

RegistryKeymyTempRegistryKey = Registry.ClassesRoot.OpenSubKey(Name);

if(myTempRegistryKey == null)

return Name;

myRegistryKey =myTempRegistryKey;

}



نمایش فایل




privatevoid ViewTemplateFiles()

{

//نمایش فایل

byte[]buffer;

stringFileType="";

TempID = Convert.ToInt32(((DataRowView)bindingSourceTemplat es.Current)["TemplateID"]);

mySqlCommand.Parameters.Clear();

mySqlCommand.Connection =mySqlConnection;

mySqlCommand.CommandText = "select TemplateFile,TemplateType from Templateswhere (TemplateID=@TemplateID)";

mySqlCommand.Parameters.Add("@TemplateID", System.Data.SqlDbType.Int).Value = TempID;

mySqlConnection.Open();

SqlDataReadermySqlDataReader = mySqlCommand.ExecuteReader();

if(mySqlDataReader.Read())

{

FileType = mySqlDataReader["TemplateType"].ToString();

if(FileType == "Adobe Acrobat Document")

{

fileName = "c:\\file.pdf";

}

elseif (FileType == "MicrosoftOffice Word Document")

{

fileName = "c:\\file.doc";

}

elseif (FileType == "MicrosoftOffice Excel Worksheet")

{

fileName = "c:\\file.xlsx";

}

mySqlConnection.Close();

mySqlConnection.Open();

buffer = (byte[])mySqlCommand.ExecuteScalar();

System.IO.File.WriteAllBytes(fileName, buffer);

System.Diagnostics.Process.Start(fileName);



}

mySqlConnection.Close();

}

forodo
چهارشنبه 01 آبان 1392, 15:44 عصر
خیلی خیلی ممنون.
فقط من کدارو تبدیل کردم به اکسس به جز 2 خط که نمی دونم منظورش چیه و چه کاری انجام میده.

OleDbConnection mySqlConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WordTable.mdb");
OleDbCommand mySqlCommand = new OleDbCommand();
string fileName;

//نمایش فایل

byte[] buffer;

string FileType = "";

int TempID = Convert.ToInt32(((DataRowView)bindingSourceTemplat es.Current)["TemplateID"]);

mySqlCommand.Parameters.Clear();

mySqlCommand.Connection = mySqlConnection;

mySqlCommand.CommandText = "select TemplateFile,TemplateType from Templateswhere (TemplateID=@TemplateID)";

mySqlCommand.Parameters.Add("@TemplateID", System.Data.SqlDbType.Int).Value = TempID;

mySqlConnection.Open();

OleDbDataReader mySqlDataReader = mySqlCommand.ExecuteReader();

یکی این خط:

int TempID = Convert.ToInt32(((DataRowView)bindingSourceTemplat es.Current)["TemplateID"]);

یکی هم این خط:

mySqlCommand.Parameters.Add("@TemplateID", System.Data.SqlDbType.Int).Value = TempID;

nafisehk
چهارشنبه 01 آبان 1392, 15:56 عصر
1
2
int TempID = Convert.ToInt32(((DataRowView)bindingSourceTemplat es.Current)["TemplateID"]);



این خط Id رکورد و میخونه.
تو این مثال رکوردا تو بایندینگ سورس هستند (دیتاگرید هم بایند به bibdingsource) هستش، Id رکورد انتخاب شده از دیتاگرید رو میگره تا فایلش رو نماش بده.


2
mySqlCommand.Parameters.Add("@TemplateID", System.Data.SqlDbType.Int).Value = TempID


این خط هم که مقدار اون Id که خونده رو به sqlcommand(
select TemplateFile,TemplateType from Templateswhere (TemplateID=@TemplateID)"; )پاس میده...

forodo
چهارشنبه 01 آبان 1392, 16:07 عصر
آهان.
چون من تو دیتاگرید لیست می کنم ID داخل بانک هم میارم ولی visibleاش false و وقتی که روی سطری دوبار کلیک می کنه میگم اون رکوردی رو از بانک بیار که برابر ID سطر کلیک شده داخل دیتاگریده.
اگه اینم جواب بدید کار من راه می افته.
چون فایل مورد نظر رو داخل بانک ذخیره می کنم به همین دلیل با هیچ آدرس فایلی کار نمی کنم. چون یکی در تهران فایل رو داخل بانک ذخیره میکنه و اون فایل مورد نظرش رو پاک میکنه و کس دیگه ای توی شیراز اونو از بانک فراخونی می کنه و نگاه میکنه.
وقتی که می خوام مثلاً فایلی که بایت بایت ذخیره شده رو بخونم مثلاً pdf چه کدی میتونم بنویسم که اون رو در برنامه خودش باز کنه.
اگه اینو بگید ممنون می شم.

nafisehk
چهارشنبه 01 آبان 1392, 16:21 عصر
خوب چیزی که میگید همینی هستش که گفتم
شما از یه Binding source استفاده کنید و datasource اون رو برابر با داده هایی که از Db میخونید قرار بدید.
بعد datasourec گرید رو هم رو اون Binding source بزارید
شما Id اون رکورد و دارید پس تو رویداد موردنظرتون که gridView1_DoubleClick هستش کد2 رو بنویسید .
موقع ذخیره فایل (به صورت بایت)هم با کد 2 نوع فایل رو ذخیره کنید تا هر فایلی با برنامه خودش باز کنه.

pedram.11
چهارشنبه 01 آبان 1392, 22:14 عصر
سلام به پروژتو تغییراتی دادم و برای فایل پی دی اف توی دیتابیس یک داده ای هم برای تست اضاف کردم.
برای خواندن اطلاعات ابتدا سطر مورد ظر رو از جدول انتخاب کنید و بعد دکمه نمایش رو بزنید.

برای فایلهای دیگه هم طبق کدهای nafisehk (http://barnamenevis.org/member.php?263629-nafisehk) عزیز کدتون رو ویرایش کنید.
112152

forodo
یک شنبه 05 آبان 1392, 15:08 عصر
ضمن تشکر از nafisehk (http://barnamenevis.org/member.php?263629-nafisehk) و pedram.11 (http://barnamenevis.org/member.php?252653-pedram.11).
یافتم، یا یا یافتم
موقعی که از بانک اطلاعاتی فراخوانی می کنم اون رو در مسیر temp ویندوز قرار می دهم و بعد از خارج شدن از برنامه آن را از آنجا پاک می کنم.
آموزش ریختن هر نوع فایلی داخل بانک اطلاعاتی اکسس و فراخوانی و اجرای آن در برنامه خودش (http://barnamenevis.org/showthread.php?425592-%D8%B1%DB%8C%D8%AE%D8%AA%D9%86-%D9%87%D8%B1-%D9%86%D9%88%D8%B9-%D9%81%D8%A7%DB%8C%D9%84%DB%8C-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C-%D8%A7%DA%A9%D8%B3%D8%B3-%D9%88-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D9%88-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AE%D9%88%D8%AF%D8%B4)

اوبالیت به بو
دوشنبه 27 آبان 1392, 10:40 صبح
درود بر شما

در این پروژه شما وقتی من اجرا می کنیم در دستور :


File.WriteAllBytes(FileName, buffer);

با این خطا مواجه می شم:


Access to the path 'C:\3003.pdf' is denied.

forodo
دوشنبه 27 آبان 1392, 14:00 عصر
هر فایلی با هر فرمتی که انتخاب می کنید این ارور رو می دهد؟

اوبالیت به بو
یک شنبه 03 آذر 1392, 18:26 عصر
هر فایلی با هر فرمتی که انتخاب می کنید این ارور رو می دهد؟


درود بر شما

با تغییر مسیر درایو مشکل حل شد. ولی اینبار می خوام که فایل رو در هارد ننویسم و مستقیم در غالب یک نوع داده Stream در یک PdfViewer نشون بدم. مشکل الان اینجاست چطر یک نوع داده arraybytes رو که اکنون به صورت varbinary در دیتابایس ذخیره شده را به Stream تبدیل کنم؟

forodo
یک شنبه 03 آذر 1392, 21:35 عصر
سلام
من برای اینکار ( فقط ورد و اکسل ) هنگامی که دارم از بانک اطلاعاتی می خونم در بین راه اون رو تبدیل به پی دی اف می کنم و سپس اون رو داخل کنترل Adobe Reader ویژوال می ریزم.
تو این تاپیک تبدیل ورد و اکسل به پی دی اف هستش. (http://barnamenevis.org/showthread.php?424871-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-Exel-%D8%A7%DA%A9%D8%B3%D9%84-%D9%88-Word-%D9%88%D8%B1%D8%AF-%D8%A8%D9%87-pdf-%D9%BE%DB%8C-%D8%AF%DB%8C-%D8%A7%D9%81)
اینم کدای داخل برنامه خودمه:

private void SadereLetterGetGet()
{
GetbufferTextDakheli();
if (FormateFile == ".docx" || FormateFile == ".doc")
{
try
{
string TempFile = Path.GetTempFileName();
File.WriteAllBytes(TempFile, buffer);
File.Move(TempFile, TempFile + FormateFile);

Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
wordDocument = appWord.Documents.Open(TempFile + FormateFile);
wordDocument.ExportAsFixedFormat(TempFile + ".pdf", WdExportFormat.wdExportFormatPDF);
axAcroPDF1.src = TempFile + ".pdf";

File.Delete(TempFile + ".pdf");
}
catch (Exception)
{

}
}
else if (FormateFile == ".xlsx" || FormateFile == ".xls")
{
try
{
string TempFile = Path.GetTempFileName();
File.WriteAllBytes(TempFile, buffer);
File.Move(TempFile, TempFile + FormateFile);
ExportWorkbookToPdf(TempFile + FormateFile, @"C:\bbb.xlsx");
axAcroPDF1.src = @"C:\bbb.xlsx" + ".pdf";

File.Delete(@"C:\aaa.xlsx" + ".pdf");
}
catch (Exception)
{

}

}

}

اون تابعی که اول بدنه استفاده شده اینه:

private void GetbufferTextDakheli()
{
try
{
SqlConnection con =
new SqlConnection("Data Source=.;Initial Catalog=Radman;" +
" User ID=sa;Password=alisql");
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();

da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = con;
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = @"SELECT FileFile, FormateFile
FROM tblErsali INNER JOIN tblDaryafti ON tblErsali.ID = tblDaryafti.LetterID
WHERE tblDaryafti.ID = " + Program.LetterID;

con.Open();
da.Fill(ds, "Word_Get");
con.Close();

buffer = (byte[])ds.Tables["Word_Get"].Rows[0]["FileFile"];
FormateFile = ds.Tables["Word_Get"].Rows[0]["FormateFile"].ToString();
}
catch (Exception)
{

}
}