2013-06-07 4 views
0

Я пытаюсь загрузить файл с диска, а затем вставить файл в столбец dbbinary db.Загрузить файл и сохранить в базу данных

Я не могу понять, как вставить двоичный файл.

Я использую C# и Linq для Sql в приложении WPF.

Вот что я пытаюсь до сих пор! Любые предложения или рекомендации будут оценены.

private void UploadFile() 
     { 
      DatabaseData.DataClassesDataContext context = new DatabaseData.DataClassesDataContext(); 
      { 
      OpenFileDialog dlgOpen = new OpenFileDialog(); 
      dlgOpen.Title = "Select file"; 

      FileData fd = new FileData(); 
      if (dlgOpen.ShowDialog() ?? false) 
      { 
       FileStream inStream = File.OpenRead(dlgOpen.FileName); 
       //FileStream outStream = File.OpenWrite(dlgOpen.FileName + ".xlsx"); 
       int b; 

       while ((b = inStream.ReadByte()) > -1) 
        // outStream.WriteByte((byte)b); 


        fd.FileId = Guid.NewGuid(); 
        //fd.DataFile = inStream;//DataFile is the Varbinary column in the db 
        fd.Title = dlgOpen.FileName; 
        fd.FileExtension = txtExtension.text; 

        context.FileDatas.InsertOnSubmit(fd); 
        context.SubmitChanges(); 

        //outStream.Flush(); 
        //outStream.Close(); 
        inStream.Close(); 
      } 
      } 
     } 
+2

ли, что даже компилировать? Я бы подумал, что столбец 'varbinary' будет представлен массивом/набором' byte 'в коде, а не потоком! – joshuahealy

+1

Нет, когда я запускаю вставки, он терпит неудачу. – UserRegistration

+2

Неудача как? Без дополнительной информации нам пришлось бы реплицировать вашу базу данных и DBML, чего меньше людей хотят сделать. – TheEvilPenguin

ответ

1

Не уверен, если это будет работать, но попробовать этот

if (dlgOpen.ShowDialog() ?? false) 
        { 
         byte[] bytes = System.IO.File.ReadAllBytes(dlgOpen.FileName); 

          fd.FileId = Guid.NewGuid(); 
          fd.DataFile = bytes; 
          fd.Title = dlgOpen.FileName;     
          context.FileDatas.InsertOnSubmit(fd); 
          context.SubmitChanges(); 
1

Чтобы исправить ошибку компиляции, удалите while заявление. Вы пытаетесь создать новый FileData(), который никогда не будет использоваться до b > -1.

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

private void UploadFile() 
{ 
    DatabaseData.DataClassesDataContext context = new DatabaseData.DataClassesDataContext(); 
    { 
     OpenFileDialog dlgOpen = new OpenFileDialog(); 
     dlgOpen.Title = "Select file"; 

     if (dlgOpen.ShowDialog() ?? false) 
     { 
      FileStream inStream = File.OpenRead(dlgOpen.FileName); 

      FileData fd = new FileData(); 
      fd.FileId = Guid.NewGuid(); 
      fd.DataFile = inStream; 
      fd.Title = dlgOpen.FileName; 
      fd.FileExtension = txtExtension.text; 

      context.FileDatas.InsertOnSubmit(fd); 
      context.SubmitChanges(); 

      inStream.Close(); 
     } 
    } 
} 
1

Ну, вы читаете мой отказ от ответственности в комментариях. Я не могу гарантировать, что какие-либо профи здесь согласятся с подходом, который он по вашему запросу. Я просто изучаю C# правильный путь и получил идею конвертировать рабочую программу без базы данных. Я нуждался в этом, чтобы преобразовать все мои существующие данные в новую базу данных, которая должна была взять на хранение:

/* Spawned from a button click 
... 
*/ 
     // 
     // Here I bring in the directory which you'll likely replace with 
     // a single file 
     // 
     string[] files = 
      Directory.GetFiles( 
      @"yourDicectory"); 

      // 
      // At this point you may disregard my loop if needed 
      // 
      foreach (string file in files) 
      { 
       // 
       // Here the entire files are read and split 
       // Handle your data how you like 
       // 
       StreamReader fileReader = new StreamReader(file); 
       string lines = fileReader.ReadToEnd(); 
       string[] entries = lines.Split(','); 

       // 
       // Here, omitted, I declare variables of types to insert "holders" 
       // Every CSV has to go to a corresponding holder of the 
       // the appropriate type (i.e., DateTime, decimal(money), or yourType) 
       // 

       SqlCeConnection con = new SqlCeConnection("Data Source = YourDataSource.sdf"); 
       con.Open(); 
       SqlCeCommand cmd = con.CreateCommand(); 

       // 
       // The insert command that takes the parsed values - value1, value2, ... 
       // which are the named and omitted declarations from above 
       // You're providing a signature of the table you're inserting into 
       // 
       cmd.CommandText = "INSERT INTO YourTable ([Column1], [Column2], [Column3], ... , [Column(n)]) VALUES (value1, value2, value3, ... , value(n))"; 

       // 
       // Here, omitted, I parse and convert the values and store them in the holders 
       // 

       // Now execute and catch if needed 
        try 
        { 
         cmd.ExecuteNonQuery(); 
        } 
        catch(SqlCeException sqle) 
        { 
         myTextbox.Text += sqle.Errors.ToString() + "\n"; 
        } 
       } 
       // 
       // Update my view - May not apply 
       // 
       myGridView1.Update(); 
       con.Close(); 
      } 
/* Do whatever else you'd like ... */ 
Смежные вопросы