Сохраните .pdf или .doc / .docx на SQL Server - PullRequest
0 голосов
/ 26 сентября 2019

Вот так выглядит мой код:

byte[] file = new byte[DocumentUpload.PostedFile.ContentLength];
DocumentUpload.FileContent.Read(file, 0, DocumentUpload.PostedFile.ContentLength);

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand("INSERT INTO requests_table([doc]) VALUES("@File)", connection);
    connection.Open();
    command.Parameters.AddWithValue("@File", file);
    command.ExecuteNonQuery();
    connection.Close();
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Я не могу опубликовать еще один вопрос на сегодня.Причина, по которой мои документы не сохраняются в моей таблице sql server, заключается в следующем: я создал папку, которую я назвал Uploads, в папках моего проекта.В этой папке находятся файлы, но я не могу получить к ним доступ, а это значит, что я не могу преобразовать их в двоичные файлы и сохранить их в моей базе данных.

Кто-нибудь знает, как избавиться от этого исключения?

System.IO.DirectoryNotFoundException: «Не удалось найти часть пути» C: \ Program Files (x86) \ IIS Express \ ~ \ Uploads '.'

0 голосов
/ 26 сентября 2019

Я предполагаю, что DocumentUpload.FileContent - это Stream - но я не знаю, что такое DocumentUpload.PostedFile - но я предполагаю, что DocumentUpload.PostedFile.ContentLength - это точный показатель длины DocumentUpload.FileContent.

  1. Вам необходимо полностью прочитать поток FileContent в цикле, а не в одном вызове Read, или использовать MemoryStream:
  2. Параметры T-SQL используются дословно, а не в кавычках.
  3. Вы уже используете using, вам не нужно закрывать SqlConnection вручную.
  4. Возможно, вам также придется закрыть SqlCommand.
  5. Не использовать AddWithValue: https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

Примерно так:

Int32 docLength = DocumentUpload.PostedFile.ContentLength;
Stream stream = DocumentUpload.FileContent;

Byte[] docBytes = new Byte[ docLength ];
{
    Int32 readSoFar = 0;
    while( readSoFar < docLength )
    {
        Int32 remaining = docLength - readSoFar;
        Int32 read = stream.Read( docBytes, offset: readSoFar, count: remaining );
        if( read == 0 ) break;
        readSoFar += read;
    }
}

using( SqlConnection c = new SqlConnection( connectionString ) )
using( SqlCommand cmd = c.CreateCommand() )
{
    cmd.CommandText = "INSERT INTO requests_table( [doc] ) VALUES( @docBytes )";
    cmd.Parameters.Add( new SqlParameter( "@docBytes", SqlDbType.VarBinary, -1 ) { Value = docBytes } );

    c.Open();
    command.ExecuteNonQuery();
}

В качестве альтернативы, используйте SqlBytes, если вы хотите переслать файл загрузки Stream который может привести к уменьшению использования памяти (в зависимости от того, как ваш SqlClient стек буферизует данные):

Stream stream = DocumentUpload.FileContent;

using( SqlConnection c = new SqlConnection( connectionString ) )
using( SqlCommand cmd = c.CreateCommand() )
{
    cmd.CommandText = "INSERT INTO requests_table( [doc] ) VALUES( @docBytes )";
    cmd.Parameters.Add( new SqlParameter( "@docBytes", SqlDbType.VarBinary, -1 ) { Value = new SqlBytes( stream ) } );

    c.Open();
    command.ExecuteNonQuery();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...