我正在使用Enterprise Library 5.0.505开发Web API,并且无法从数据库中获取字节数组。我的insert语句使用DbType.Binary可以很好地工作,但是当我尝试使用SqlStringAccessor返回它时,它出现为空。
我尝试研究它,但是大多数帖子使用读者,并且我的项目不允许这样做。
我的Get方法:
public IEnumerable<User> UserSearch(string username)
{
string sql = "SELECT * FROM Users WHERE Username = @Username";
var accessor = Database.CreateSqlStringAccessor<User>(sql, new NamedParameterMapper("@Username"));
return accessor.Execute(username);
}
我的用户类型的属性:
public int UserId { get; set; }
public string Username { get; set; }
public byte[] SaltedAndHashedPassword { get; set; }
public byte[] Salt { get; set; }
public bool LoggedIn { get; set; }
我拥有的插入代码可以正常工作:
using (DbCommand cmd = Database.GetStoredProcCommand("[HeadCount_Ver01].[dbo].[AddUser]"))
{
Database.AddInParameter(cmd, "@Username", DbType.String, user.Username);
Database.AddInParameter(cmd, "@SaltedAndHashedPassword", DbType.Binary, user.SaltedAndHashedPassword);
Database.AddInParameter(cmd, "@Salt", DbType.Binary, user.Salt);
return Database.ExecuteNonQuery(cmd) > 0;
}
非常感谢您的帮助。
答案 0 :(得分:0)
自从这样做以来已经有一段时间了,但是如果我没记错的话,一种更简单的方法是使用SqlDbType.Binary作为输出参数,然后只需通过查询提取该值即可。
下面的代码未经测试,并且使用该方法从另一个示例进行了修改。从SqlDbType.Binary到字节数组的转换可能需要引起注意或修改,但应该非常接近。
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("select @bytearray = dbcolumn from table", conn))
{
SqlParameter outputByteParam = new SqlParameter("@bytearray", SqlDbType.Binary)
{
Direction = ParameterDirection.Output
};
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(outputByteParam);
conn.Open();
cmd.ExecuteNonQuery();
byte[] result = outputByteParam.GetValueOrDefault<byte[]>(); // this line might need attention
}