Como faço para inserir um byte em uma coluna VARBINARY do SQL Server

Eu tenho uma matriz de bytes destacada abaixo, como faço para inseri-lo em uma coluna Varbinary de database do SQL Server?

byte[] arraytoinsert = new byte[10]{0,1,2,3,4,5,6,7,8,9}; string sql = string.format ( "INSERT INTO mssqltable (varbinarycolumn) VALUES ({0});",WHATTODOHERE ); 

Obrigado antecipadamente caras!

Minha solução seria usar uma consulta parametrizada, pois os objects de conectividade cuidam de formatar os dados corretamente (incluindo a garantia do tipo de dados correto e a fuga de caracteres “perigosos” quando aplicável):

 // Assuming "conn" is an open SqlConnection using(SqlCommand cmd = new SqlCommand("INSERT INTO mssqltable(varbinarycolumn) VALUES (@binaryValue)", conn)) { // Replace 8000, below, with the correct size of the field cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, 8000).Value = arraytoinsert; cmd.ExecuteNonQuery(); } 

Edit: Adicionado o wrapping “usando” declaração, tal como sugerido por John Saunders para descartar corretamente o SqlCommand depois de terminar com

Tente isto:

 "0x" + BitConverter.ToString(arraytoinsert).Replace("-", "") 

Embora você realmente deva usar uma consulta parametrizada em vez de concatenação de strings …

Não há problema se todos os arrays que você está prestes a usar neste cenário são pequenos como no seu exemplo.

Se você usar isso para blobs grandes (por exemplo, armazenar arquivos binários grandes, Mbs ou até mesmo Gbs em tamanho em um VARBINARY ), então provavelmente seria melhor usar um suporte específico no SQL Server para ler / escrever subseções de tais blobs grandes. Coisas como READTEXT e UPDATETEXT ou em versões atuais do SQL Server SUBSTRING .

Para obter mais informações e exemplos, consulte meu artigo de 2006 no .NET Magazine ( “BLOB + Stream = BlobStream” , em holandês, com código-fonte completo) ou uma tradução em inglês e uma generalização disso no CodeProject de Peter de Jonghe. Ambos estão ligados a partir do meu blog .

verifique este link da imagem para todas as etapas https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

Passo 1: Eu criei um campo do tipo varbinary na tabela

Passo 2: Eu criei um procedimento armazenado para aceitar um parâmetro do tipo sql_variant

Passo 3: No meu front end página asp.net, eu criei um parâmetro de fonte de dados sql do tipo de object

    UPLOAD DOCUMENT              

PASSO 4: No meu código por trás, eu tento carregar o FileBytes do controle FileUpload através desta chamada de procedimento armazenado usando um controle de fonte de dados sql

  Dim filebytes As Object filebytes = FileUpload1.FileBytes() sqldsFileUploadConn.InsertParameters("DocBinaryForm").DefaultValue = filebytes.ToString Dim uploadstatus As Int16 = sqldsFileUploadConn.Insert() ' ... code continues ... ' 

Você pode fazer algo assim, uma solução muito simples e eficiente: O que eu fiz foi realmente usar um parâmetro em vez de espaço reservado básico, criei um object SqlParameter e usei outro método de execução existente. Por exemplo, no seu cenário:

 string sql = "INSERT INTO mssqltable (varbinarycolumn) VALUES (@img)"; SqlParameter param = new SqlParameter("img", arraytoinsert); //where img is your parameter name in the query ExecuteStoreCommand(sql, param); 

Isso deve funcionar como um encanto, desde que você tenha uma conexão SQL aberta estabelecida.