2012-05-29 54 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