2017-11-25 182 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

相關問題