0

好的,所以我发现了问题所在,它在 sql 转换函数中。当它应该是 nvarchar(30) 时,我正在转换为 varchar(30)。来看看区别。varchar 和 nvarchar 有什么区别?

我想这可能是一个愚蠢的问题,但我似乎无法从这个函数返回的字符串中删除某种空间。我想第一个真正的问题是为什么当我们像这样“1234789”保存到数据库时,这个函数会返回这样的字符串“1 2 3 4 5 6 7 8 9”。第二个问题是为什么会这样

Replace("1 2 3 4 5 6 7 8 9","\p{Zs}","")

或者

Replace("1 2 3 4 5 6 7 8 9"," ","")

不工作,我有一种感觉,因为中间的字符看起来像空格但不是。

我的手表

    Private Shared Function GetEncryptedPmtField(lhID As Integer, accountId As Integer, fieldName As String)
        Dim openKeyCmd = String.Format("OPEN SYMMETRIC KEY somekey DECRYPTION BY PASSWORD = '{0}'",     ConfigurationManager.AppSettings("Somethingsomething"))
        Const closeKeyCmd As String = "CLOSE SYMMETRIC KEY somekey"

        Dim command As New SqlCommand()
        command.Connection = New SqlConnection(ConfigurationManager.ConnectionStrings("Something").ConnectionString)
        command.CommandType = CommandType.Text
        command.CommandText = String.Format("{0} SELECT convert(varchar(30),decryptbykey({1})  FROM  paymentacct WHERE lh_id = @lhid AND id = @id ; {2}", openKeyCmd, fieldName, closeKeyCmd)
        command.Parameters.AddRange({New SqlParameter With {.ParameterName = "lhid", .Value = lhID}, New SqlParameter With {.ParameterName = "id", .Value = accountId}})
        command.Connection.Open()
        Dim baNum = command.ExecuteScalar().ToString()
        command.Connection.Close()
        Return baNum
    End Function
4

2 回答 2

0

谢谢大家的帮助,这里是修复。因此,问题在于我将加密字段转换为的类型。我使用的是 varchar 而不是 nvarchar。

  SELECT convert(varchar(30),decryptbykey(keyname) FROM  paymentacct

 SELECT convert(nvarchar(30),decryptbykey(keyname))  FROM  paymentacct

注意转换函数中的 varchar -> nvarchar 变化

于 2012-09-06T17:35:05.677 回答
-1

给正则表达式 \sa 试试

System.Diagnostics.Debug.WriteLine(Regex.Replace("12 3  4   5   ",@"\s+",""));

如果您使用的是 String.Replace,那么它不会将“\p{Zs}”识别为空格。
您需要使用正则表达式。该问题未标记正则表达式。

你是说在数据库中它是正确的值吗?

于 2012-09-06T17:00:04.607 回答