2013-07-23 4 views
0

Мне нужно написать приложение или запрос для экспорта большого количества файлов PDF в файл и создать текстовый файл с разделителями, который показывает, где находятся файлы, и содержит идентификатор записи.Экспорт PDF из базы данных SQL Server и запись карты в текстовый файл

Что я думал о том, чтобы использовать консольное приложение, которое записало бы запись в текстовый файл после экспорта PDF из БД, таким образом, я бы всю информацию собирал при написании текстового файла, чтобы я мог убедитесь, что все данные в текстовом файле с разделителями были точными.

Сначала я думал об использовании набора данных для этого, но там будет более 50 000 строк данных. Я не уверен, что DataTable будет лучше.

Я также изучал использование утилиты BCP, но из того, что я читал, экспорт не дает мне PDF-файл из данных, это правда ?

Я, вероятно, считаю себя новичком, программируя что-то вроде этого. Что я должен использовать для структуры данных, как это? я бы использовал курсор, и если да, то как бы настроить его так, чтобы он соответствовал тому, что я делаю?

Update

Я собираюсь попробовать и использовать опцию DataSet, но ограничить его 1 дней стоит данных в то время, используя делать во время цикла, так что я могу петлю через каждый день от начало данных до сегодняшней даты. поэтому я сделаю данные за день, а затем избавлюсь от DataSet, а затем сделаю следующую дату.

Неужели кто-нибудь видит в моей логике что-нибудь, что может вызвать проблемы?

+0

разм Просмотр Кода [Экспорт PDF из базы данных обратно в PDF] (http://codereview.stackexchange.com/questions/33087/exporting-pdf-from-database-back-to-pdf-format) – Malachi

ответ

1

Когда я, наконец, закончил исследование всех различных подходов к проблеме, это было очень просто для кодирования. Я вообще не использовал BCP.

Я создал переменные для информации, которую я извлекал, что я хотел в текстовом файле.

  1. Имя файла
  2. Дата (От SQL таблицы для оригинала Дата создания)
  3. Номер дела (внутренний идентификатор для программы 3-й партии, чтобы связать с)
  4. Описание (Взято из SQL таблицы для описания документ)

Тогда я поставил приложение для работы Написание кода в PDF по одному

using (SqlConnection Conn = new SqlConnection(strSQLConn)) 
     { 
      //open the connection 
      Conn.Open(); 
      Console.WriteLine("the connection is open"); 

      //Variables needed for looping 
      DateTime Today = System.DateTime.Now; 
      DateTime StartDate = Convert.ToDateTime("2008-06-11 00:00:00"); 
      //DateTime StartDate = Today.AddDays(-10); 
      Console.WriteLine("Converting the Documents from " + StartDate.ToString() + " - TO - " + Today.ToString()); 
      Console.WriteLine("Press Any Key to continue."); 
      Console.ReadLine(); 
      int RecordCount = 0; 
      ulong ByteCount = 0; 
      int i = 1; 
      foreach (DateTime day in EachDay(StartDate, Today)) 
      { 
       String strDay = day.ToString(); 
       // Create a SQLCommand to retrieve Data 
       SqlCommand getRecords = new SqlCommand("spRecapturePDF", Conn); 
       getRecords.CommandType = CommandType.StoredProcedure; 
       getRecords.Parameters.Add(new SqlParameter("@OneDay", strDay)); 
       SqlDataReader reader = getRecords.ExecuteReader(); 
       //stuff exporting the binary code to the PDF format 
       FileStream fs; 
       BinaryWriter bw; 
       int buffersize = 100; 
       byte[] outbyte = new byte[buffersize]; 
       long retval; 
       long startIndex = 0; 

       int j = 1; 

       while (reader.Read()) 
       { 
        strFileName = reader.GetString(0) + "-" + i + "-" + j; 
        strDock_no = reader.GetString(0); 
        dtFiledate = reader.GetDateTime(2); 
        strDescription = reader.GetString(4); 
        fs = new FileStream("c:\\FolderName\\" + strFileName + ".pdf", FileMode.OpenOrCreate, FileAccess.Write); 
        bw = new BinaryWriter(fs); 
        startIndex = 0; 
        retval = reader.GetBytes(1,startIndex,outbyte,0,buffersize); 
        while (retval == buffersize) 
        { 
         bw.Write(outbyte); 
         bw.Flush(); 
         startIndex += buffersize; 
         retval = reader.GetBytes(1,startIndex,outbyte,0,buffersize); 
        } 
        //write the remaining buffer. 
        bw.Write(outbyte,0,(int)retval); 
        ByteCount = ByteCount + Convert.ToUInt64(fs.Length); 
        bw.Flush(); 
        //close the output file 
        bw.Close(); 
        fs.Close(); 
        //need to write to the Text file here. 
        TextWriter tw = new StreamWriter(path,true); 
        tw.WriteLine(strDock_no + "~" + dtFiledate.ToString() + "~" + "c:\\FolderName\\" + strFileName + ".pdf" + "~" + strDescription); 
        tw.Close(); 
        // increment the J variable for the Next FileName 
        j++; 
        RecordCount++; 
       } 
      //close the reader and the connection 
       reader.Close(); 
       i++; 
      } 
     Console.WriteLine("Number of Records Processed: " + RecordCount.ToString()); 
      Console.WriteLine("for a Total of : " + ByteCount + " Bytes"); 

      Decimal MByteCount = new Decimal(2); 
      MByteCount = Convert.ToDecimal(ByteCount)/1024/1024; 
      Decimal GByteCount = new Decimal(2); 
      GByteCount = MByteCount/1024; 

      Console.WriteLine("Total MBs : " + MByteCount.ToString() + " MB"); 
      Console.WriteLine("Total GBs : " + GByteCount.ToString() + " GB"); 
      Console.WriteLine("Press Enter to Continue ..."); 
      Console.ReadLine(); 
     } 

настоящий Кодекс был включен в заявление foreach, которое продолжалось день ото дня, начиная с даты начала и окончания. внутри этого foreach заявить приложение, называемое хранимой процедурой, которому был назначен указанный день, чтобы вызвать записи, которые были введены в этот день.

переменные i и j были созданы потому, что мне нужно было иметь уникальное имя файла, даже если у меня был тот же номер случая. i представлял день (потому что я каждый день ходил в своем заявлении на выбор), а j представлял номер записи за этот день из оператора select.

foreach и while петли были заключены в using(conn), так что независимо от того, что соединение будет закрыто окончательно.

В конце цикла while я написал текстовый файл. текстовый файл был создан за пределами всех циклов, чтобы я мог просто добавить файл, а не перезаписать его. этот код:

string path = @"c:\\FolderName\\TextFile.txt"; 
     if (!File.Exists(path)) 
     { 
      TextWriter tw = new StreamWriter(path, false); 
      tw.WriteLine("Dock_No~Date~FileName(Location)~Description"); 
      tw.Close(); 
     } 

Я надеюсь, что это поможет кому-то еще. Я оставил все коды Console.Writeline и Console.ReadLine, которые не были необходимы для функциональности, которую я искал. Я также добавил код, который бы подсчитал байты, которые были написаны, и некоторый код для подсчета обработанных записей. это просто забавный материал, который мне нужно знать, мне нужно очистить материал Fun в конце.

это кишках, что потребовалось, чтобы выполнить массовую Экстракт PDF-файлов из поля Blob в SQL Server, минус некоторые соединения Мамбо Джамбо

Foreach день Настройте

это код что я использовал, чтобы сделать foreach так, как я этого хотел.

static public IEnumerable<DateTime> EachDay(DateTime Startdate, DateTime EndDate) 
    { 
     for (var day = Startdate.Date; day.Date <= EndDate.Date; day = day.AddDays(1)) 
      yield return day; 
    } 
Смежные вопросы