无法使用企业库从SQL数据库获取字节数组

时间:2019-07-30 20:13:46

标签: c# sql enterprise-library

我正在使用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;
            }

非常感谢您的帮助。

1 个答案:

答案 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 
}