SQL将unicode编码的varbinary转换为字符串

时间:2013-06-12 20:35:38

标签: c# sql encoding varbinary

好的,我必须导出REG_BINARY值并将它们存储在SQL中,稍后我需要将这些值转换为字符串..

我有什么:

在c#中我将REG_BINARY读取为Byte []数据类型,如:

RegistryKey rk = Registry.CurrentUser.OpenSubKey ...

byte [] value = rk.GetValue(“TheKey”)

然后我使用:

将它存储到SQL VarBinary字段
        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 

我得到:

0x0000000038A1BB1005E5101AA1BB08002B2A56C200006D737073742E646C6C00000000004E495441F9BFB80100AA0037D96E0000000043003A005C00550073006500720073005C00630068007200690073007400690061006E002E006D007500670067006C0069005C0044006F00630075006D0065006E00740073005C004F00750074006C006F006F006B002000460069006C00650073005C006F006E0065006D006F0072006500730061006D0070006C0065002E007000730074000000

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

0x38A1BB15E5101AA1BB082B2A56C26D737073742E646C6C4E495441F9BFB801AA37D96E433A5C55736572735C63687269737469616E2E6D7567676C695C446F63756D656E74735C4F75746C6F6F6B2046696C65735C6F6E656D6F726573616D706C652E707374

当我将该值转换为VARCHAR(MAX)时,我得到: 8→å¡+ *VÂmspst.dllNITAù¿¸ª7ÙnC:\ Users \ MYREMOVEPROFILENAME \ Documents \ Outlook Files \ onemoresample.pst

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

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

1 个答案:

答案 0 :(得分:3)

您应该在特定的unicode GetString()上使用Text.Encoding方法将其转换回字符串。将列从阅读器转换为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);
}