2012-05-29 52 views
0

也許我只是沒有使用google搜索正確的參數,但我似乎無法找出這一個。
我已經創建了一個哈希密碼,根據我的理解,它應該是一個字節數組。 然後我需要將它插入到SqlDataSource中,這就是我的問題所在。問題插入字節[]到SqlDataSource ASP.Net

我的數據庫定義如下;

 
**Column** || **Data Type** 
---------------------------- 
Name  || varchar(50) 
Username || varchar(50) 
HashedPwd || varbinary(50) 
Salt  || varbinary(50) 
UserType || varchar(50)

我的代碼如下;

HashAlgorithm hashing = new SHA256Managed(); 
byte[] passwordPlainText = (new System.Text.ASCIIEncoding()).GetBytes(txtPassword.ToString()); 
byte[] salt = (new System.Text.ASCIIEncoding()).GetBytes(RNGCryptoServiceProvider.Create().ToString()); 
// Combine salt and password before hashing. 
byte[] saltAndPwd = new byte[passwordPlainText.Length + salt.Length]; 
Array.Copy(passwordPlainText, saltAndPwd, passwordPlainText.Length); 
Array.Copy(salt, 0, saltAndPwd, passwordPlainText.Length, salt.Length); 
byte[] hashedPwd = hashing.ComputeHash(saltAndPwd); 

database.InsertCommandType = SqlDataSourceCommandType.Text; 
database.InsertCommand = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, Type) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);"; 
database.InsertParameters.Add("insName", txtName.Text); 
database.InsertParameters.Add("insUsername", txtUsername.Text); 
database.InsertParameters.Add("insHashedPass", (new System.Text.ASCIIEncoding()).GetString(hashedPwd)); 
database.InsertParameters.Add("insSalt", (new System.Text.ASCIIEncoding()).GetString(salt)); 
database.InsertParameters.Add("insType", txtType.Text); 
database.Insert(); 

數據庫的東西是我從互聯網上的研究中收集到的,看到我在Visual Studio中使用方便的自動完成功能給出了哪些選項。
僅供參考我正在使用Visual Studio 2010版本10.0.4,.Net版本4.0.3
似乎有一些SQL連接的外部庫,但我寧願只使用.Net提供的內置東西。

此刻,我在運行插入算法時收到此錯誤;
不允許將數據類型nvarchar隱式轉換爲varbinary。使用CONVERT函數來運行此查詢。
我不知道如何使用轉換功能。
Add()方法可以採用字符串,就像我現在正在做的字符串,或者它也可以採用字符串,DbType,字符串。我試過database.InsertParameters.Add("insSalt", DbType.Binary, salt);,但我甚至無法編譯/構建網站。我得到; 「無法從字節[]轉換爲字符串」。
如果我將其更改爲salt.ToString(),我會得到; 「無法將參數值從字符串轉換爲Insert()行上的Btye []」。

所以是的...真的失去了,任何幫助將不勝感激。

回答

2

您不需要SqlDataSource,它用於數據綁定控件。你需要的是SqlConnection & SqlCommand。 這裏就是你要做的:

...your hashing code here... 

using (SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=test; Integrated Security=SSPI;")) 
{ 
    var command = conn.CreateCommand(); 
    command.CommandText = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, UserType) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);"; 
    command.CommandType = System.Data.CommandType.Text; 

    command.Parameters.Add(new SqlParameter("insName", txtName.Text)); 
    command.Parameters.Add(new SqlParameter("insUsername", txtUsername.Text)); 
    command.Parameters.Add(new SqlParameter("insHashedPass", hashedPwd)); 
    command.Parameters.Add(new SqlParameter("insSalt", salt)); 
    command.Parameters.Add(new SqlParameter("insType", txtType.Text)); 

    conn.Open(); 
    command.ExecuteNonQuery(); 
} 

另外請注意,我已經改變了「類型」在你的命令文本,以配合您的數據庫表定義「用戶類型」。當然,您需要替換連接字符串以匹配您的連接字符串。

+0

OK,該代碼有效。感謝那。 您能否爲我澄清一下,爲什麼我不使用SqlDataSource?我會使用SqlDataSource訪問顯示數據庫中的用戶和類型的GridView嗎?當我瀏覽這個頁面時,它就是這樣的; http://www.asp.net/web-forms/tutorials/moving-to-aspnet-20/data-bound-controls – FizzBuzz

+0

不客氣。引用MSDN,SqlDataSource _「將SQL數據庫表示爲數據綁定控件。「_所以,是的,你可以使用它在它和GridView之間來回傳遞數據,因爲GridView是一個數據綁定控件。另一方面,這裏只是存儲一些數據(不是來自任何控件)到一個數據庫表。 – m1kael

+0

很好,謝謝澄清。 – FizzBuzz

0

我最近有類似的問題。您需要檢查創建哈希的類以查看返回類型。

如果返回類型是串,那麼你將不能夠分配給:

字節[] hashedPwd = hashing.ComputeHash(saltAndPwd);

+0

很確定VS會讓我知道如果這是一個問題。也就是說,我查了一下,ComputeHash(byte [])返回byte [] – FizzBuzz