如何在SQL Server中存储和检索varbinary(max)列

5
我正在开发一个应用程序,希望将用户的指纹存储到数据库中,并与从设备中获取的指纹进行比较。 在将varbinary(max)列转换回byte []时,我遇到了某些问题。我尝试使用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();
}

请问有没有人能向我展示如何将byte[]插入到varbinary(max)列中,然后检索它?


是的,但它为所有用户插入相同的值 :? - Nosheen
2个回答

12

你应该始终使用参数。试试这个:

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[];
    }
}

插入后我该如何检索它? - Nosheen
1
非常感谢,你真的解决了我的问题 :) 我已经做了大约4天了,我以为是某种sdk问题。 - Nosheen
@Nosheen 很高兴我能帮到你 :) - Dimitar Dimitrov

1
如果您拥有这些指纹的文件格式,那么您可以使用以下代码,将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"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接