Я предполагаю, что DocumentUpload.FileContent
- это Stream
- но я не знаю, что такое DocumentUpload.PostedFile
- но я предполагаю, что DocumentUpload.PostedFile.ContentLength
- это точный показатель длины DocumentUpload.FileContent
.
- Вам необходимо полностью прочитать поток
FileContent
в цикле, а не в одном вызове Read
, или использовать MemoryStream
: - Параметры T-SQL используются дословно, а не в кавычках.
- Вы уже используете
using
, вам не нужно закрывать SqlConnection
вручную. - Возможно, вам также придется закрыть
SqlCommand
. - Не использовать
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();
}