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

Nos*_*een 2 c# sql-server arrays varbinarymax

我正在开发一个应用程序,我想将用户指纹存储到数据库中,然后将其与从设备中获取的指纹进行比较.将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();
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以取悦我,我怎么能首先将byte []插入varbinary类型的列并检索它.

Dim*_*rov 10

你应该总是使用参数.试一试:

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 ...
}
Run Code Online (Sandbox Code Playgroud)

编辑

既然你已经问过如何检索它,你可以做一些事情(不确定你的确切要求,但它应该给你的想法):

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[];
    }
}
Run Code Online (Sandbox Code Playgroud)