Как сохранить и получить столбец 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"];
Другие вопросы по тегам