将字节 [] 插入 SqlDataSource ASP.Net 的问题
Posted
技术标签:
【中文标题】将字节 [] 插入 SqlDataSource ASP.Net 的问题【英文标题】:Problems Inserting Byte[] into SqlDataSource ASP.Net 【发布时间】:2012-05-29 14:24:12 【问题描述】:也许我只是没有在谷歌上搜索正确的参数,但我似乎无法弄清楚这一点。 我创建了一个散列密码,据我了解,它应该是一个字节数组。 然后我需要将它插入到 SqlDataSource 中,这就是我的问题所在。
我的数据库定义如下;
**专栏** || **数据类型** ---------------------------- 姓名 || varchar(50) 用户名 || varchar(50) 哈希密码 ||变量二进制 (50) 盐 ||变量二进制 (50) 用户类型 || 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();
数据库资料是我从 Internet 上的研究中收集到的,并查看了 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() 行上的“无法将参数值从字符串转换为 Btye[]”。
所以是的...真的迷路了,任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您不需要 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();
另外请注意,我已将命令文本中的“类型”更改为“用户类型”以匹配您的数据库表定义。当然,您需要替换连接字符串以匹配您的。
【讨论】:
好的,该代码有效。感谢那。您能否为我澄清一下,为什么我不使用 SqlDataSource ?我会使用 SqlDataSource 访问显示数据库中的用户和类型的 GridView 吗?这就是我浏览此页面时的阅读方式; asp.net/web-forms/tutorials/moving-to-aspnet-20/… 不客气。引用 MSDN,SqlDataSource “表示一个 SQL 数据库到数据绑定控件。” 所以是的,您可以使用它在它和 GridView 之间来回传递数据,因为 GridView 是 数据绑定控件。另一方面,在这里,您只是将一些数据(不是来自任何控件)存储到 db 表中。【参考方案2】:我最近遇到了类似的问题。您需要检查创建哈希的类以查看返回类型是什么。
如果返回类型是字符串,那么你将无法分配给:
byte[] hashedPwd = hashing.ComputeHash(saltAndPwd);
【讨论】:
很确定 VS 会告诉我这是否是一个问题。也就是说,我检查了,ComputeHash(byte[]) 返回 byte[]以上是关于将字节 [] 插入 SqlDataSource ASP.Net 的问题的主要内容,如果未能解决你的问题,请参考以下文章
SqlDataSource.Select()?我该如何使用它? (ASP.net)
ASP.NET:将外部变量传递到 <asp:sqldatasource> 标记 ASP.NET 2.0
三层架构中具有复杂 sqldatasource 的 Gridview
在 HTML 表格中显示 SqlDataSource 数据(DataTables 插件)