Вопрос по arrays, sql-server – Как вставить байт [] в столбец VARBINARY SQL Server

61

У меня есть подсвеченный массив байтов, как мне вставить его в столбец 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   ответов
-1

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>

STEP 4: в моем коде я пытаюсь загрузить FileBytes из FileUpload Control через этот вызов хранимой процедуры, используя sql control source data

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

               ' ... code continues ... '
71

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

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

Джейсон, не могли бы вы поставить оператор использования вокруг "SqlCommand cmd = new ..."? В противном случае я буду вынужден понизить голосование и ненавижу это. John Saunders
Если столбец VARBINARY (MAX), замените 8000 на -1, см. Social.msdn.microsoft.com / Форумы / EN-US / sqldataaccess / резьба / ... Mark Lakata
77

Попробуй это

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

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

Привет, Дэвид, спасибо за ответ, почему я должен использовать параметризованный запрос? divinci
Minimal здесь, но параметризованные запросы могут быть скомпилированы и затем кэшированы, сохраняя стоимость компиляции с каждым последующим запросом. Они также защищают от атак SQL-инъекций. Наконец, вы можете напрямую установить значение параметра в байтовом массиве и избежать использования BitConverter ... David M
Не думайте, что работать с VARBINARIES, как это, вообще хорошая идея. SQL Server допускает очень большие VARBINARIES (было ли это 2 Гб?), И это, вероятно, не "очень хорошо масштабируется" с этим методом. Не могу оценить, будет ли это проблемой в данном конкретном случае, поэтому сейчас я опускаю -1. peSHIr
@ peSHIr: -1 для кого? Все, что я сделал, это ответил на вопрос, который был задан ... David M
Наконец, ответ на этот вопрос вместо «вы должны использовать параметры ...». Есть причины не использовать параметры - например, превышение 2100 параметров в одном запросе. Abir
0

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

1

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

Если вы будете использовать это для больших двоичных объектов (например, для хранения больших двоичных файлов размером в несколько МБ или даже ГБ вVARBINARY) тогда вам, вероятно, будет гораздо лучше использовать специальную поддержку в SQL Server для чтения / записи подразделов таких больших двоичных объектов. Вещи какREADTEXT а такжеUPDATETEXT или в текущих версиях SQL ServerSUBSTRING.

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

Похожие вопросы