无法将 varchar 空/空值插入或更新到始终加密的列中
Posted
技术标签:
【中文标题】无法将 varchar 空/空值插入或更新到始终加密的列中【英文标题】:Cannot insert or update varchar empty/null value into always encrypted column 【发布时间】:2018-06-28 09:55:33 【问题描述】:我正在尝试使用 sql 客户端将 C# 中的空 ""
或 null
值更新为始终加密的列;但是我得到了错误。如果我传递一个空格" "
,它就可以工作。
错误:
使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK', column_encryption_key_database_name = 'db') 加密的 nvarchar(4000) 与使用 (encryption_type = 'DETERMINISTIC' 加密的 nvarchar(50) 不兼容, encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK',column_encryption_key_database_name = 'db')
【问题讨论】:
请发布您的代码/查询和表架构。该错误抱怨参数/字段大小,而不是空值或空字符串。其中一个长度为 50,另一个长度为 4000。您是如何尝试更新表的?您是否使用了参数化查询或存储过程?参数的大小是多少? 列模式是 nVarchar(50) 如果我传递任何有效的值,空值和空值存在问题,4000 大小我没有在表或过程中使用,不知道它在哪里服用 4000 如果您不使用尺寸,将采用默认尺寸。发布您的代码。 谢谢您的回复,创建参数对象时需要大小,我的代码中没有。下面的工作示例代码。 SqlConnection 连接 = 新 SqlConnection(dbString);连接.打开(); SqlParameter p = new SqlParameter("@lastname", System.Data.SqlDbType.NVarChar, 50); p.Value = string.Empty; SqlCommand command = new SqlCommand("更新关联集 lastname=@lastname", connection); command.Parameters.Add(p); command.ExecuteNonQuery();连接.Close(); 如果您已经解决了问题(我是这样阅读您的上一条评论的?)请输入解决方案作为答案并接受它。这会将问题从未回答的列表中删除。 【参考方案1】:工作代码如下:
SqlConnection connection = new SqlConnection(dbString);
connection.Open();
SqlParameter p = new SqlParameter("@lastname", System.Data.SqlDbType.NVarChar, 50);
p.Value = string.Empty;
SqlCommand command = new SqlCommand("update associate set lastname=@lastname", connection);
command.Parameters.Add(p);
command.ExecuteNonQuery();
connection.Close();
问题是客户端参数定义必须与服务器上的加密列类型完全匹配。
【讨论】:
以上是关于无法将 varchar 空/空值插入或更新到始终加密的列中的主要内容,如果未能解决你的问题,请参考以下文章
无法将值 NULL 插入列“id”、表“XXX”;列不允许空值。插入失败
SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败
SqlException:无法将值 NULL 插入列“CarId”、表“AutoServiceDb.dbo.ServiceOrders”;列不允许空值。插入失败