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

标签 c# sql enterprise-library

我正在使用 Enterprise Library 5.0.505 开发 Web API,但在从数据库获取字节数组时遇到了问题。我的插入语句使用 DbType.Binary 工作得很好,但是当我尝试使用 SqlStringAccessor 返回它时,它出现了 null。

我已经尝试研究它,但大多数帖子都使用阅读器,而我的项目不允许使用该方法。

我的获取方法:

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

非常感谢任何帮助,谢谢。

最佳答案

我已经有一段时间没有这样做了,但如果我没记错的话,一种更简单的方法是使用 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 
}

关于c# - 无法使用企业库从 SQL 数据库获取字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57279360/

相关文章:

c# - BackgroundWorker 异常处理

C# 将数组分配到堆栈?

sql - 亚马逊雅典娜 : Convert bigint timestamp to readable timestamp

mysql - 选择语句奇怪的行为

enterprise-library - spring Net 与企业库

c# - Unity 2.0 请说明

c# - 使用 nreco 将图像与视频合并

c# - 允许处理无响应消息的请求-响应逻辑

c# - Nhibernate CommitAsync 是否等待所有异步 CRUD 操作?

sql - Get-AzureADUser - ALL - PowerShell Slow 获取所有用户和对帐户进行更改的用户