【发布时间】:2016-10-28 21:57:15
【问题描述】:
是否有可能将 DapperORM 与 (Azure) SQL 2016 Always Encrypted 一起使用?是否有任何文档如何使用和最佳实践?
尤其是新的参数属性输入方向和输入长度如何处理?
【问题讨论】:
标签: dapper sql-server-2016 azure-sql-database always-encrypted
是否有可能将 DapperORM 与 (Azure) SQL 2016 Always Encrypted 一起使用?是否有任何文档如何使用和最佳实践?
尤其是新的参数属性输入方向和输入长度如何处理?
【问题讨论】:
标签: dapper sql-server-2016 azure-sql-database always-encrypted
以下链接将帮助您开始使用 Always Encrypted。
我没有使用 Dapper ORM,但是,只要您能够使用连接字符串启用 Always Encrypted 并参数化您的文字,您应该没问题。
这是我尝试过的一个快速示例。请注意连接字符串中的Column Encryption Setting=Enabled,它为给定的连接启用始终加密。
private static readonly string connectionString = @"Data Source=.;Initial Catalog=dbName;Integrated Security=true;Connection Timeout=60;Column Encryption Setting=Enabled";
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
int id = 1;
var dog = conn.Query<Dog>("select age, name, weight, idcol from DogTable where idcol = @Id", new { Id = id });
}
}
public class Dog
{
public int? age { get; set; }
public int idcol { get; set; }
public string name { get; set; }
public float? weight { get; set; }
public int IgnoredProperty { get { return 1; } }
}
【讨论】:
为了补充 Nikhil 的答案,这是可能的,而且他引用的资源很有帮助,但是参数化文章可能有点误导,我将包含一个我刚刚开始工作的 sn-p,以防万一。您不必像在 SSMS 中那样在您的 sql 中使用 DECLARE @SSN...,一旦我修复了我的类型问题(参见代码块后面的段落),打击对我来说效果很好。
string sql = "SELECT * from dob.ExampleTable WHERE IsActive = 1 SSN = @SSN";
var results = await this.DbConnection.QueryAsync(sql, new
{
SSN = 999999999
});
另外,请注意不匹配的数据类型。我无法使用 Dapper 使 char 或 varchar 作为我的 SSN 列的目标类型(我能够使用直接 ADO.NET 将列显式配置为 CHAR 或 VARCHAR 但 Dapper 似乎假定所有字符串为 NVARCHAR(4000)字段,这导致使用 Dapper 时出错)。 NVARCHAR 和 NCHAR 工作正常。我认为这与以下事实有关:当您加密列时,它将“真实”数据类型更改为 NCHAR(50) 以及从 nvarchar(4000)=>CHAR(9)=>NCHAR 转换 dapper (50) 不起作用,但仅在 Dapper 中。
【讨论】: