2011-12-16 10 views
7

Robię program z serwera C# i sql i mam problem, mam nadzieję, że jeśli ktoś mi pomoże.Otwórz dokument tekstowy (zapisany jako binarny) z bazy danych

Będę, ale baza danych na PC i program zostanie zainstalowany na innych komputerach, a program app pcs podłączony do tej bazy danych.

dokumenty oszczędzania programu (słowo -excel) jako binarne, używając tego kodu:

byte[] ReadFile(string sPath) 
    { 
     //Initialize byte array with a null value initially. 
     byte[] data = null; 

     //Use FileInfo object to get file size. 
     FileInfo fInfo = new FileInfo(sPath); 
     long numBytes = fInfo.Length; 

     //Open FileStream to read file 
     FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read); 

     //Use BinaryReader to read file stream into byte array. 
     BinaryReader br = new BinaryReader(fStream); 

     //When you use BinaryReader, you need to supply number of bytes to read from file. 
     //In this case we want to read entire file. So supplying total number of bytes. 
     data = br.ReadBytes((int)numBytes); 
     return data; 
    } 

private void button1_Click(object sender, EventArgs e) 
    { 
     string dt = dateTimePicker1.Value.ToShortDateString(); 

     byte[] red = ReadFile(textBox3.Text); 
     con.Open(); 
     string qry = "insert into documents ([Account no],Name,[Phone number],Date,[Document name],Document,Type) values(@accon,@name,@phone,@date,@docname,@doc,@type)"; 

     //Initialize SqlCommand object for insert. 
     SqlCommand SqlCom = new SqlCommand(qry, con); 

     //We are passing Original Image Path and Image byte data as sql parameters. 

     SqlCom.Parameters.Add(new SqlParameter("@accon", textBox1.Text)); 
     SqlCom.Parameters.Add(new SqlParameter("@name", textBox2.Text)); 
     SqlCom.Parameters.Add(new SqlParameter("@phone", textBox3.Text)); 
     SqlCom.Parameters.Add(new SqlParameter("@date", dt)); 
     SqlCom.Parameters.Add(new SqlParameter("@docname", textBox1.Text)); 
     SqlCom.Parameters.Add(new SqlParameter("@doc", (object)red)); 

     SqlCom.Parameters.Add(new SqlParameter("@type", (object)textBox2.Text)); 
     SqlCom.ExecuteNonQuery(); 
     con.Close(); 

     MessageBox.Show("done"); 
    } 

problem: że nie wiem jak pobrać dokumenty zapisane w bazie danych i otwórz go za pomocą programu Microsoft Word lub Microsoft Excel według ich typów.

Chcę wybrać konkretną bazę formy dokumentu i otworzyć go

góry dziękuję

+0

Co przechowujesz w 'Type' dla Worda, a co dla Excela? –

Odpowiedz

11
String connStr = "connection string"; 

// add here extension that depends on your file type 
string fileName = Path.GetTempFileName() + ".doc"; 

using (SqlConnection conn = new SqlConnection(connStr)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
     // you have to distinguish here which document, I assume that there is an `id` column 
     cmd.CommandText = "select document from documents where id = @id"; 
     cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1; 
     using (SqlDataReader dr = cmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       int size = 1024 * 1024; 
       byte[] buffer = new byte[size]; 
       int readBytes = 0; 
       int index = 0; 

       using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) 
       { 
        while ((readBytes = (int)dr.GetBytes(0, index, buffer, 0, size)) > 0) 
        { 
         fs.Write(buffer, 0, readBytes); 
         index += readBytes; 
        } 
       } 
      } 
     } 
    } 
} 

// open your file, the proper application will be executed because of proper file extension 
Process prc = new Process(); 
prc.StartInfo.FileName = fileName; 
prc.Start(); 
+2

Naprawdę nie wiem jak ci podziękować, spędziłem dużo czasu w tym problemie i nie znalazłem odpowiedniego rozwiązania. Wielkie dzięki :)))) – moonshine

+0

@moonshine, nie trzeba dziękować. Po prostu zaakceptuj (i głosuj, jeśli naprawdę chcesz) odpowiedź brzmi tak samo :-). –

+1

Akceptowałem, ale do głosowania potrzebuję 15 reputacji, mam tylko 11 punktów reputacji , kiedy osiągnę 15 głosów, na pewno zagłosuję :) – moonshine

0

Sedno jest Response.ContentType:

Response.ContentType = "application/vnd.xls"; // for excel 
Response.ContentType = "application/ms-word"; // for word 
Response.ContentType = "image/jpg";//for jpg images 

Zaleca się przechowywać typ zawartości również w bazie danych, tak aby Twój kod będzie ogólny i może wyświetlać/przechowywać dowolny typ pliku:

System.Data.SqlClient.SqlDataReader rdr = null; 
System.Data.SqlClient.SqlConnection conn = null; 
System.Data.SqlClient.SqlCommand selcmd = null; 
try 
{ 
    conn = new System.Data.SqlClient.SqlConnection(
     System.Configuration.ConfigurationManager 
     .ConnectionStrings["ConnectionString"].ConnectionString); 
    selcmd = new System.Data.SqlClient.SqlCommand(
     "select pic1 from msg where msgid=" + Request.QueryString["imgid"], 
     conn); 

    conn.Open(); 
    rdr = selcmd.ExecuteReader(); 
    while (rdr.Read()) 
    { 
     Response.ContentType = "image/jpg"; 
     Response.BinaryWrite((byte[])rdr["pic1"]); 
    } 
    if (rdr != null) 
     rdr.Close(); 
} 
finally 
{ 
    if (conn != null) 
     conn.Close(); 
} 
+0

dziękuję, to jest przydatne porady Próbowałem ten kod i pokazać ten błąd błąd Nazwa „Zapytanie” nie istnieje w bieżącym kontekście \t i dodałem odniesienia system.Web i używając go – moonshine

+0

oi jestem tak przepraszam! zapytałeś o aplikację Windows i podałem rozwiązanie dla aplikacji internetowej. – Zia

+0

Nie wspominaj o tym, dziękuję ci za pomoc :) – moonshine

0

Po pobraniu dokumentu z bazy danych (lub dowolnego rodzaju pamięci, której chcesz używać na serwerze), powinieneś zapisać dokument w folderze tymczasowym Windows (Path.GetSpecialFolder) i użyć biblioteki Word Interop do uruchomienia słowa (lub Excel z wykorzystaniem własnej biblioteki współdziałania) z właśnie zapisanym dokumentem.

var temporayFileName = Path.GetRandomFileName(); 
var temporaryFileStream = File.Open(temporaryFileName, FileMode.Create); 
var memoryStream = documentRepository.Get(...); 
memoryStream.CopyTo(temporaryFileStream); 

// Word App 
dynamic wordApp = new Application { Visible = true }; 
var doc = wordApp.Documents.Add(TemplateName); 
templatedDocument.Activate(); 

(Zobacz ten dokument, aby uzyskać więcej informacji na temat zakładania i manipulacji słowo: http://msdn.microsoft.com/en-us/magazine/ff714583.aspx) .

+0

dziękuję, ale nie zapisałem dokumentów na serwerze Zapisałem go jako plik binarny w bazie danych – moonshine

+0

Nie ma znaczenia w tym kodzie, jak twoja dokumentRepository dostaje jego dokument. Lub jest twoje pytanie, jak odzyskać dane binarne? – Jaapjan

+0

tak, bardzo dziękuję za pomoc – moonshine

Powiązane problemy