将Byte []插入SqlDataSource ASP.Net时出现问题

时间:2012-05-29 14:24:13

标签: asp.net sql

也许我只是没有使用Google搜索正确的参数,但我似乎无法想出这个参数 我创建了一个哈希密码,根据我的理解,它应该是一个字节数组。 然后我需要将它插入到SqlDataSource中,这就是我的问题所在。

我的数据库定义如下;

 
**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);,但我甚至无法编译/构建网站。我明白了“无法从byte []转换为String” 如果我将其更改为salt.ToString()我得到; “无法在Insert()行上将参数值从String转换为Btye []”。

所以是的......真的输了,任何帮助都会非常感激。

2 个答案:

答案 0 :(得分: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();
}

另请注意,我已在命令文本中将“Type”更改为“UserType”以匹配您的数据库表定义。当然,您需要替换连接字符串以匹配您的连接字符串。

答案 1 :(得分:0)

我最近遇到了类似的问题。您需要检查创建哈希的类,以查看返回类型。

如果返回类型是字符串,那么您将无法分配到:

byte [] hashedPwd = hashing.ComputeHash(saltAndPwd);

相关问题