将字节 [] 插入 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 插件)

vs2017关于SqlDataSource无法使用参数控件绑定的问题

如何为 SqlDataSource 动态绑定变量参数