открытый текстовый документ (сохраненный как двоичный файл) из базы данных - PullRequest
7 голосов
/ 16 декабря 2011

Я делаю программу с c # и сервером sql, и у меня есть проблема, я надеюсь, если кто-нибудь мне поможет.

Я буду, но база данных на ПК и программа будут установлены на других ПК, и программа app pcs 'подключена к этой базе данных.

программа, сохраняющая документы (word -excel) в двоичном виде, используя этот код:

  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");
    }

проблема: я не знаю, как извлечь сохраненные документы в базу данных и открыть их с помощью Microsoft Word или Microsoft Excel в соответствии с их типами.

Я хочу выбрать конкретную базу данных форм документов и открыть ее

Заранее спасибо

Ответы [ 3 ]

12 голосов
/ 16 декабря 2011
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();
0 голосов
/ 16 декабря 2011

После того, как вы извлекли документ из базы данных (или любого типа хранилища, которое вы хотите использовать на сервере), вы должны сохранить документ во временной папке Windows (Path.GetSpecialFolder) и использовать библиотеку Word Interop для запуска слова (или превзойти, используя собственную библиотеку взаимодействия) с только что сохраненным документом.

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();

(см. Этот документ для получения дополнительной информации о запуске и управлении словом: http://msdn.microsoft.com/en-us/magazine/ff714583.aspx) .

0 голосов
/ 16 декабря 2011

Суть Response.ContentType:

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

Рекомендуется сохранять тип содержимого также в базе данных, чтобы ваш код был универсальным и мог отображать / хранить файлы любого типа

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...