10

NLog を使用してアプリケーションにログインしています。その一環として、C# の文字列である顧客番号とデータベースの varbinary(32) をログに記録しています。この特定のパラメーターに次の SQL コードを使用しています。SQL ステートメントの残りの部分は正常に機能します。

CONVERT(varbinary(32), @CustNumber)

および次の NLog パラメータ:

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

Nlog パラメータを追加する C# の次のコード:

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 に答える