Как сохранить и получить столбец varbinary(max) в Sql Server
Я занимаюсь разработкой приложения, в котором я хочу сохранить отпечаток пальца пользователя в базе данных, а затем сравнить его с отпечатком, взятым с устройства. У меня возникают определенные проблемы при преобразовании столбца varbinary(max) обратно в байт []. Я пытался использовать функцию GetSqlBinary, но она дает мне исключение indexoutofrangeException.
Я использую приведенный ниже код для хранения шаблона в базе данных, но обнаружил, что значение одинаково для всех пользователей, например, 0x000000
public int insernewVoter(NSubject thumb)
{
connectionOpen();
byteArray = thumb.GetTemplateBuffer().ToArray();
int insert = 0;
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO VOTER (THUMB) VALUES(CONVERT(varbinary(max),'" + byteArray + "'))";
int rowsupdated = cmd.ExecuteNonQuery();
if (rowsupdated <= 0) {
MessageBox.Show("Ho Gya");
}
else {
MessageBox.Show("AP MAR KYN NAI JATA :D");
}
return 0;
connectionClose();
}
Может кто-нибудь, пожалуйста, пожалуйста, сообщите мне, как я могу сначала вставить байт [] в столбец типа varbinary и получить его.
2 ответа
Вы должны ВСЕГДА использовать параметры. Дайте этому шанс:
using(var conn = new SqlConnection("YOUR CONNECTION STRING ..."))
using (var cmd = new SqlCommand("INSERT INTO VOTER (THUMB) VALUES(@THUMB)", conn)) {
conn.Open();
var param = new SqlParameter("@THUMB", SqlDbType.Binary) {
// here goes your binary data (make sure it's correct)
Value = thumb.GetTemplateBuffer().ToArray()
};
cmd.Parameters.Add(param);
int rowsAffected = cmd.ExecuteNonQuery();
// do your other magic ...
}
РЕДАКТИРОВАТЬ
Так как вы спросили, как его найти, вы можете сделать что-то вроде (не уверен в ваших точных требованиях, но это должно дать вам идею):
private byte[] GetThumbData(int userId) {
using (var conn = new SqlConnection("YOUR CONNECTION STRING ..."))
using (var cmd = new SqlCommand("SELECT THUMB FROM VOTER WHERE ID = @ID", conn)) {
conn.Open();
cmd.Parameters.AddWithValue("@ID", userId);
return cmd.ExecuteScalar() as byte[];
}
}
Если у вас есть эти отпечатки пальцев в формате файла, то вы можете использовать следующий код, который преобразует pdf в байт и снова байт в pdf
string filepath = Server.MapPath("~/pdf/" + file.FileName);
byte[] bytes = System.IO.File.ReadAllBytes(filepath);
и передать это в поле базы данных varbinary сейчас, чтобы получить этот контент в PDF, который вы можете использовать
byte[] pdfcontent = (byte[])DS.Tables[0].Rows[0]["PDFContent"];