10

我正在使用 NLog 登录我的应用程序,作为其中的一部分,我们正在记录客户编号,这是 C# 中的字符串和数据库中的 varbinary(32)。我为此特定参数使用以下 SQL 代码。SQL 语句的其余部分工作正常:

CONVERT(varbinary(32), @CustNumber)

和以下 NLog 参数:

<parameter name="@CustNumber" layout="${event-context:item=CustNumber}" />

以及 C# 中的以下代码添加 Nlog 参数:

myEvent.Properties.Add("CustNumber", custNumber);

由于某种原因,实际表中存储的值只是原始客户编号字符串的第一个字符。我进行了双重和三重检查,以确保在将字符串发送到数据库之前我没有截断它。任何帮助将不胜感激。

4

1 回答 1

12

原因是当您插入时,您正在将 Unicode (nvarchar(xx)) 字符串转换为 varbinary。然后,当您选择时,您将转换为 varchar(xx)。如果您转换为 nvarchar(xx) 它将正常工作。

例如:

  • 插入“这是一个测试”作为 varbinary(30) 会导致 0x7468697320697320612074657374。

  • 插入 N'this is a test' 作为 varbinary(30) 会导致 0x74006800690073002000690073002000610020007400650073007400。

因此,当您转换回来时,如果您指定 varchar(30),则第一个 00 将截断字符串。

这对我来说很好:

delete from Table_2

insert Table_2 (Test) values( CONVERT(varbinary(30), N'this is a test') ) 
select * from Table_2
select CONVERT(nvarchar(30), test) from Table_2

这也是

delete from Table_2

insert Table_2 (Test) values( CONVERT(varbinary(30), 'this is a test') )
select * from Table_2
select CONVERT(varchar(30), test) from Table_2
于 2012-05-09T19:40:54.323 回答