2017-11-25 181 views
2

我有字符串值项:如何在SQL Server中转换为二进制后得到的字符串返回在C#

TxtProductKey.Text has value "key" 

编码这个值

byte[] Key = Encoding.ASCII.GetBytes(TxtProductKey.Text.Trim()); 

将它保存在数据库表中的数据类型的列binary(50) null

下表中的值如下:

0x6B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

现在我试图把它找回来的,我输入的字符串值Key

byte [] TempKey = (byte[])LicenseInfo.Tables[0].Rows[0]["ProductKey"]; 
var newText = Encoding.ASCII.GetString(TempKey); 

但我在得到结果newText是:

k\0\0\0\0\0\00\ 

我在哪里干什么有什么问题?我希望您的建议

C#代码在数据库中保存的值:

Sqlconnection.Open(); 

SqlCommand Cmd = new SqlCommand("SpAddAttempts", Sqlconnection); 
Cmd.CommandType = CommandType.StoredProcedure; 
Cmd.Parameters.Add("@Attempts", SqlDbType.Int).Value = Attempt; 
Cmd.Parameters.Add("@Activate", SqlDbType.Bit).Value = Activate; 
Cmd.Parameters.Add("@Key", SqlDbType.Binary).Value = Key; 

Cmd.ExecuteNonQuery(); 
CloseConnection(); 

存储过程:

ALTER PROCEDURE [dbo].[SpAddAttempts] 
    @Attempts INT, 
    @Activate BIT, 
    @Key BINARY 
AS 
BEGIN 
    UPDATE License 
    SET Attempts = @Attempts, 
     Activate = @Activate, 
     ProductKey = @Key 
    WHERE LicenseId = '1' 
END 
+0

您没有保存它是正确的。数据只有一个非零字节,它应该有三个字节(即'0x6B657900 ...') – dasblinkenlight

+0

你可以这样做,你可以在调试中看到关键字节数组的值是什么?它进入数据库之前。这个例子只显示了db二进制数据中的一个字符 – farbiondriven

+0

@dasblinkenlight你能告诉我错误吗?我的保存代码在我的文章中。 – john

回答

2

我不认为你可以:你只存储一个字节(相当于char k)在您的db表中。0x68是k,下一个字节是0x00 - ascii null - 字符串终止符 - 无论您的语言选择是否将其称为,它绝对不是e

所以,因为只有第一个字节被保留,其余的是ascii NUL 000000000000000000000000 ....),所以无法知道其余的值是否为eyeyboardoolaid等。故障是在在表中存储值(您没有显示该部分的代码) - 它只存储第一个字节

我建议您将此文本存储为文本而不是二进制;它看起来像是一个不必要的痛苦世界,当它以文本形式开始生活时,将它作为二进制文件存储起来,而你显然希望它以文本的形式返回。

编辑:现在你已经发布了保存的代码,我可以看到你已经声明了参数类型二进制,但你还没有指定一个长度,所以长度默认为1个字节。这就是为什么只有一个字节被保存。您需要更多地声明参数:

cmd.Parameters.Add("@Key", SqlDbType.Binary, binaryData.Length); //dont pass an array longer than what the table can store, or you'll get a "data would be truncated" error 
+1

我输入“key”进行保存,编码原因是为了保护它,否则很容易直接保存文本。可能是我在做任何错误,所以它只保存“键”中的“k”值。 – john

+0

哦,是的,将它转换为二进制文件会使它非常安全,当它将两个额外的按键粘贴到https://www.branah.com/ascii-converter并将原始的ascii恢复时。 ROT13的文本很难破解(阅读:花几秒钟的时间才能意识到这是安全机制)。要么执行一个适当的安全解决方案,或将其存储为文本,并检查您的“谁有SQL服务器密码”政策:) –

+0

兄弟你似乎更专业我退出新所以没有太多的信息,但谢谢你给我更多的信息:)我编辑后现在你可以找到代码存储数据。 – john

相关问题