Как вставить байт [] в столбец 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
);
Ответы
Ответ 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>
</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 ... '