Подтвердить что ты не робот

Как вставить байт [] в столбец 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
    );
4b9b3361

Ответ 1

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

// 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();
}

Изменить: добавлен оператор "using" для обертывания, предложенный Джоном Сандерсом, чтобы правильно распорядиться SqlCommand после того, как он закончил с помощью

Ответ 2

Попробуйте следующее:

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

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

Ответ 3

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

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

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

Ответ 4

Вы можете сделать что-то вроде этого, очень простое и эффективное решение: Я действительно использовал параметр вместо основного заполнителя, создал объект 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.

Ответ 5

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

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

STEP2: я создал хранимую процедуру для принятия параметра типа sql_variant

STEP3: На моей странице 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 Control через этот вызов хранимой процедуры, используя элемент управления источником данных sql

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

               ' ... code continues ... '