2017-11-25 4 views
2

나는 문자열 값 키가 :는 SQL Server의 바이너리로 변환 한 후 다시 C#에서 문자열을받는 방법

TxtProductKey.Text has value "key" 

인코딩을 데이터 형식의 열에 데이터베이스 테이블에 저장이 값

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

binary(50) null.

테이블의 값은 다음과 같습니다 Key

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

하지만 난에 무엇입니까 결과 이제

0x6B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

내가 입력 한 문자열 값에 다시 얻기 위해 노력하고있다

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

오른쪽으로 저장하지 않습니다. 데이터에는 0이 아닌 바이트가 하나 뿐이며 3 바이트가 있어야합니다 (예 :'0x6B657900 ...') – dasblinkenlight

+0

그럴 수 있습니다. 디버그에서 키 바이트 배열의 값이 무엇인지 알 수 있습니까? 그것이 DB 안에 들어가기 전에. 이 예제에서는 db 바이너리 데이터의 한 문자 만 보여줍니다. – farbiondriven

+0

@dasblinkenlight 실수를 표시 할 수 있습니까? 내 저축 코드가 내 게시물에 있습니다. – john

답변

2

나는 당신이 할 수 있다고 생각하지 않습니다 : 당신은 단지 하나의 바이트를 저장 (숯불 k의 등가물) 귀하의 db 테이블에 .. 0x68은 k, 다음 바이트는 0x00입니다 - 아스키 null을 - 문자열 터미네이터 - 선택의 언어는 무엇이든간에, 그것을 확실히 참조하지 않습니다

첫 번째 바이트 만 보존되었으므로 나머지는 ascii NUL 000000000000000000000000 ....입니다. 따라서 나머지 값이 ey, eyboard, oolaid 등인지 알 수있는 방법이 없습니다. 오류가 발생하는 동안 테이블에 값을 저장 (그 부분에 대한 코드를 표시하지 않음) - 첫 번째 바이트 만 저장 됨

이 텍스트를 바이너리가 아닌 텍스트로 저장하는 것이 좋습니다. 텍스트로 삶을 시작할 때 그것을 바이너리로 저장하는 것은 불필요한 고통의 세계처럼 보이고 분명히 텍스트로 되돌아 가고 싶을 것입니다.

EDIT : 저장을 수행하는 코드를 게시 했으므로 매개 변수를 Binary 형식으로 선언 한 것을 볼 수 있지만 길이를 지정하지 않으므로 길이는 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

저장을 위해 "키"를 입력하고 인코딩의 이유는 텍스트를 직접 저장하는 것이 쉽습니다. 내가 "키"의 "k"값만 저장하도록 실수를하고있을 수 있습니다. – john

+0

오, 예, 바이너리로 변환하면 https://www.branah.com/ascii-converter에 붙여 넣기 할 때 몇 가지 추가 키 스트로크가 생길 때 정말 안전합니다. 원래의 ascii를 되 찾을 수 있습니다. ROT13 텍스트는 깨지기가 더 어려울 것입니다 (읽기 : 보안 메커니즘임을 깨닫기까지 몇 초가 걸립니다). 적절한 보안 솔루션을 구현하거나 텍스트로 저장하고 "누가 SQL Server 암호를 가지고 있습니까?"정책을 검토하십시오. :) –

+0

당신은 더 전문적인 것처럼 보입니다. 나는 새로운 정보를 얻지 못하지만 더 많은 정보를 주셔서 감사합니다. :) 이제 데이터를 저장하기위한 코드를 찾을 수있는 게시물을 편집했습니다. – john

관련 문제