2013-06-12 309 views
4

好吧,我有出口REG_BINARY值,并将其存储在SQL后来我需要将这些值转换为字符串..SQL Unicode转换编码VARBINARY字符串

我有什么:

在C#我读REG_BINARY到字节]的数据类型,如:

的RegistryKey RK = Registry.CurrentUser.OpenSubKey ...

字节[]值= rk.GetValue( “TheKey”)

 private void SqlStorePstFileInfo(List<PersonalFolderObject> listOfPstObjects, int? userComputerId) 
    { 
     using (var sqlConnection = new SqlConnection(GetConnectionString())) 
     { 
      sqlConnection.Open(); 
      foreach (PersonalFolderObject pfo in listOfPstObjects) 
      { 
       string s = "INSERT INTO [InvPstFile] (UserComputerId, Name, Path, Size, OldRegBinary) VALUES(@UserComputerId, @Name, @Path, @Size, @OldRegBinary)"; 
       using (SqlCommand sqlCmd = new SqlCommand(s, sqlConnection)) 
       { 
        SqlParameter pUserComputerId = sqlCmd.Parameters.Add("@UserComputerId", SqlDbType.Int); 
        pUserComputerId.Value = userComputerId; 
        SqlParameter pName = sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar); 
        pName.Value = pfo.Name; 
        SqlParameter pPath = sqlCmd.Parameters.Add("@Path", SqlDbType.NVarChar); 
        pPath.Value = pfo.OldPath; 
        SqlParameter pSize = sqlCmd.Parameters.Add("@Size", SqlDbType.Int); 
        pSize.Value = pfo.Size; 
        SqlParameter pOldRegBinary = sqlCmd.Parameters.Add("@OldRegBinary", SqlDbType.VarBinary); 
        pOldRegBinary.Value = pfo.OldRegBinary; 
        sqlCmd.ExecuteNonQuery(); 
       } 

       //string s = string.Format("INSERT INTO [InvPstFile] (UserComputerId, Name, Path, Size) " + 
       //       "VALUES ('{0}','{1}','{2}','{3}')", 
       //       userComputerId, pfo.Name, pfo.OldPath, pfo.Size); 

       //Helpers.Logging.Log.Info(string.Format("SQL: {0}", s)); 
       //var sqlCmd = new SqlCommand(s, sqlConnection); 
       //sqlCmd.ExecuteNonQuery(); 
      } 
      sqlConnection.Close(); 
     } 
    } 

当我使用读取SQL Management Studio中存储的值:

select oldregbinary from InvPstFile where PersonalFolderId = 73 

我得到:然后我用它存储到一个SQL VARBINARY场

0x0000000038A1BB1005E5101AA1BB08002B2A56C200006D737073742E646C6C00000000004E495441F9BFB80100AA0037D96E0000000043003A005C00550073006500720073005C00630068007200690073007400690061006E002E006D007500670067006C0069005C0044006F00630075006D0065006E00740073005C004F00750074006C006F006F006B002000460069006C00650073005C006F00 6E0065006D006F0072006500730061006D0070006C0065002E007000730074000000

当我尝试使用CAST(AboveString as VARCHAR(max))将其转换为字符串时,我得不到任何结果(显示)。原因是unicode编码。当我更换/删除所有00我得到:

0x38A1BB15E5101AA1BB082B2A56C26D737073742E646C6C4E495441F9BFB801AA37D96E433A5C55736572735C63687269737469616E2E6D7567676C695C446F63756D656E74735C4F75746C6F6F6B2046696C65735C6F6E656D6F726573616D706C652E707374

当我投该值VARCHAR(MAX),我得到: 8¡»å¡»+ *VÂmspst.dllNITAù¿¸ª7ÙnC:\用户\ MYREMOVEPROFILENAME \ Documents \ Outlook Files \ onemoresample.pst

那么,任何想法如何转换/将Unicode编码值转换为字符串?

(我知道你可以解码上面的字符串,找到替代MYREMOVEPROFILENAME - 这是不值得的努力;))

+2

您是否尝试过铸造'为nvarchar(MAX)'? –

+0

是的,同样的结果=>什么也没有。即使我在SSMS –

+0

中选择了'result to text'奇怪 - [这个人](http://dba.fyicenter.com/faq/sql_server/Converting_Binary_Strings_into_Unicode_Characters.html)似乎也遇到过类似的问题。 –

回答

2

您应该使用在特定的unicode Text.EncodingGetString()方法将其转换回字符串。将列从列表中读取到byte[],然后使用GetString()将其转换为字符串。

string value; 
using (SqlCommand command = new SqlCommand("select * from InvPstFile", sqlConnection)) 
{ 
    SqlDataReader sdr = command.ExecuteReader(); 
    //Assuming we are just reading 1 row here 
    sdr.Read(); 
    var bytes = (byte[])sdr["OldRegBinary"]; 

    // Based on the original unicode format one of the following should 
    // give you the string value 
    value = System.Text.Encoding.UTF8.GetString(bytes); 
    value = System.Text.Encoding.Unicode.GetString(bytes); 
    value = System.Text.Encoding.Default.GetString(bytes); 
} 
相关问题