Как вставить байт[] в столбец 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 ответов:
моим решением было бы использовать параметризованный запрос, поскольку объекты подключения заботятся о правильном форматировании данных (включая обеспечение правильного типа данных и экранирование "опасных" символов, где это применимо):
// 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 ServerSUBSTRING
.для получения дополнительной информации и примеров см. Либо мою статью 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> </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.