Как вставить байт[] в столбец VARBINARY SQL Server


У меня есть массив байтов, выделенный ниже, как вставить его в столбец Varbinary базы данных 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
    );

заранее спасибо ребята!

5 60

5 ответов:

моим решением было бы использовать параметризованный запрос, поскольку объекты подключения заботятся о правильном форматировании данных (включая обеспечение правильного типа данных и экранирование "опасных" символов, где это применимо):

// 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: добавлен оператор wrapping "using", предложенный Джоном Сондерсом, чтобы правильно избавиться от SqlCommand после его завершения с помощью

попробуйте это:

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

хотя вы действительно должны использовать параметризованный запрос, а не конкатенацию строк, конечно...

нет проблем, если все массивы, которые вы собираетесь использовать в этом сценарии-это небольшие, как в вашем примере.

если вы будете использовать это для больших больших двоичных файлов (например, хранение больших двоичных файлов много Mbs или даже Gbs в размере в VARBINARY) тогда вам, вероятно, будет гораздо лучше использовать конкретную поддержку в SQL Server для чтения/записи подразделов таких больших больших двоичных объектов. Такие вещи, как READTEXT и UPDATETEXT, или в текущих версиях SQL Server SUBSTRING.

для получения дополнительной информации и примеров см. Либо мою статью 2006 года в журнале .NET ( "BLOB + Stream = BlobStream" на голландском языке, с полным исходным кодом), или английский перевод и обобщение этого на CodeProject Питер де Йонге. Оба они связаны с мой блог.

проверьте эту ссылку изображения для всех шагов https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

Шаг 1: я создал поле типа varbinary в таблице

Шаг 2: я создал хранимую процедуру, чтобы принять параметр типа sql_variant

Шаг 3: в моем переднем конце asp.net страница, я создал параметр источника данных sql типа объекта

        <tr>
        <td>
            UPLOAD DOCUMENT</td>
        <td>
            <asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="btnUpload" runat="server" Text="Upload" />
            <asp:SqlDataSource ID="sqldsFileUploadConn" runat="server" 
                ConnectionString="<%$ ConnectionStrings: %>" 
                InsertCommand="ph_SaveDocument"     
               InsertCommandType="StoredProcedure">
                <InsertParameters>
                    <asp:Parameter Name="DocBinaryForm" Type="Object" />
                </InsertParameters>

             </asp:SqlDataSource>
        </td>
        <td>
            &nbsp;</td>
    </tr>

Шаг 4: в моем коде позади, я пытаюсь загрузить FileBytes из FileUpload Управление с помощью этого вызова хранимой процедуры с помощью SQL Data source control

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

               ' ... code continues ... '

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

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);

Это должно работать как шарм, если у вас есть открытое соединение с SQL.