Как вставить байт [] в столбец 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();
}
Редактировать: добавлен переносной оператор "using", предложенный Джоном Сондерсом для правильной утилизации SqlCommand после его завершения
Попробуй это:
"0x" + BitConverter.ToString(arraytoinsert).Replace("-", "")
Хотя вы действительно должны использовать параметризованный запрос, а не конкатенацию строк, конечно...
Вы можете сделать что-то вроде этого, очень простое и эффективное решение: на самом деле я использовал параметр вместо основного заполнителя, создал объект 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.
Нет проблем, если все массивы, которые вы собираетесь использовать в этом сценарии, маленькие, как в вашем примере.
Если вы будете использовать это для больших двоичных объектов (например, для хранения больших двоичных файлов размером в несколько МБ или даже ГБ в 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>
</td>
</tr>
ШАГ 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 ... '