Загрузить файл и сохранить в базу данных

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

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

Я использую С# и Linq to 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();
            }
            }
        }

person UserRegistration    schedule 07.06.2013    source источник
comment
Это даже компилируется? Я бы подумал, что столбец varbinary будет представлен массивом/набором byte в коде, а не потоком!   -  person joshuahealy    schedule 07.06.2013
comment
Нет, когда я запускаю вставки, это не удается.   -  person UserRegistration    schedule 07.06.2013
comment
Не получается как? Без дополнительной информации нам пришлось бы реплицировать вашу базу данных и DBML, что меньше людей готовы делать.   -  person TheEvilPenguin    schedule 07.06.2013
comment
Встроенная инструкция не может быть декларацией или помеченной инструкцией. FileData fd = новые FileData(); Я пытаюсь взять его из IF!   -  person UserRegistration    schedule 07.06.2013
comment
Если хотите, я могу опубликовать только что написанный код, который считывает набор файлов и вставляет значения CS в базу данных. Это текстовые файлы, и значения преобразуются в типы даты и денег. Не уверен, что это поможет.   -  person ChiefTwoPencils    schedule 07.06.2013
comment
Конечно, спасибо за помощь!   -  person UserRegistration    schedule 07.06.2013


Ответы (4)


Не уверен, что это сработает, но попробуйте это

 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();
person KeyboardFriendly    schedule 07.06.2013
comment
bytes = File.ReadAllBytes(dlgOpen.FileName);. Это не будет хорошо работать с большими файлами. - person Steve Smith; 17.10.2019

Чтобы исправить ошибку компиляции, удалите оператор 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();
        }
    }
}
person TheEvilPenguin    schedule 07.06.2013

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

/* 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 ... */
person ChiefTwoPencils    schedule 07.06.2013