- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在从 Java 迁移到 C#,现在我意识到我更喜欢 C# 语言的特性而不是 Java 中的特性,但是我有这个小问题。在 MySQL Connector/J 和 JDBC 中,我相信我的一个应用程序允许多个 PreparedStatement
s 在另一个打开时执行,就像我可以执行返回 ResultSet
的查询一样而那ResultSet
还开着,我可以再开一个PreparedStatement
得到另一个 ResultSet
或者我可以根据我从第一个 ResultSet
获得的数据执行更新(即,当我意识到该行在密码列中有明文密码时,插入盐值并使用 SHA512 哈希更新密码列)。
但是,使用 Connector/NET 时,我开始意识到每当我尝试这样做时,我都会收到此错误: MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
是否有一种简单的方法来修复此错误,也许是 MySQL 到 .NET 桥的任何其他实现?我真的不想在一个应用程序中创建很多数据库连接,尽管我可能想为我的应用程序中的每个线程创建一个(如在 ThreadLocal 中)。当我用两种不同的方法同时执行两个查询时,ThreadLocal 数据库连接会有所帮助,但显然我不能将这两个命令分开到不同的线程中,而且我不想创建多余的线程。
顺便说一句,这是代码本身。是的,我可以将更新代码移到关闭阅读器后,但我有更多类似的方法,其中一些比这个更难修复:
MySqlConnection con = DatabaseConnection.GetConnection();
MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT `id`,`password`,`salt`,`pin`,`gender`,`birthday` FROM `accounts` WHERE `name` = '" + AccountName + "'";
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
AccountId = reader.GetInt32(0);
string passhash = !reader.IsDBNull(1) ? reader.GetString(1) : null;
string salt = !reader.IsDBNull(2) ? reader.GetString(2) : null;
m_pin = !reader.IsDBNull(3) ? reader.GetString(3) : null;
Gender = !reader.IsDBNull(4) ? reader.GetByte(4) : WvsCommon.Gender.UNDEFINED;
m_birthday = !reader.IsDBNull(5) ? reader.GetInt32(5) : 0;
if (!HashFunctions.HashEquals(pwd, HashAlgorithms.SHA512, passhash + salt))
{
if (passhash == pwd || salt == null && HashFunctions.HashEquals(pwd, HashAlgorithms.SHA1, passhash))
{
salt = HashFunctions.GenerateSalt();
passhash = HashFunctions.GenerateSaltedSha512Hash(pwd, salt);
MySqlCommand update = con.CreateCommand();
update.CommandText = "UPDATE `accounts` SET `password` = '" + passhash + "', `salt` = '" + salt + "' WHERE `id` = " + AccountId;
update.ExecuteNonQuery();
update.Dispose();
}
}
}
reader.Close();
cmd.Dispose();
如果移动更新代码是唯一的可能性,或者如果它是最好的,我想我将不得不使用它,但我想先获得更多关于其他可能性的想法,然后再选择一个选项。
最佳答案
不,我敢打赌在 Java 世界中也是如此。
正在积极使用/保持连接来检索该数据,如果它在 java 世界中有效是因为它执行了以下操作之一:
我在一个问题上看不多,你只需要移动读者。靠近你代码中的适当位置。也就是说,无论如何您都应该检查该代码,因为如果发生异常,您的处置/关闭调用将不会被正确调用。使用 using 语句确保所有内容都被适本地释放,在具有这些更改的代码的修改版本下方(以及其他一些使其不那么深的右侧):
using(MySqlConnection con = DatabaseConnection.GetConnection())
using(MySqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "SELECT `id`,`password`,`salt`,`pin`,`gender`,`birthday` FROM `accounts` WHERE `name` = '" + AccountName + "'";
using(MySqlDataReader reader = cmd.ExecuteReader())
{
if(!reader.Read()) return;
AccountId = reader.GetInt32(0);
string passhash = !reader.IsDBNull(1) ? reader.GetString(1) : null;
string salt = !reader.IsDBNull(2) ? reader.GetString(2) : null;
m_pin = !reader.IsDBNull(3) ? reader.GetString(3) : null;
Gender = !reader.IsDBNull(4) ? reader.GetByte(4) : WvsCommon.Gender.UNDEFINED;
m_birthday = !reader.IsDBNull(5) ? reader.GetInt32(5) : 0;
reader.Close();
if (HashFunctions.HashEquals(pwd, HashAlgorithms.SHA512, passhash + salt))
return;
if(passhash != pwd && !(salt == null && HashFunctions.HashEquals(pwd, HashAlgorithms.SHA1, passhash)))
return;
salt = HashFunctions.GenerateSalt();
passhash = HashFunctions.GenerateSaltedSha512Hash(pwd, salt);
using(MySqlCommand update = con.CreateCommand())
{
update.CommandText = "UPDATE `accounts` SET `password` = '" + passhash + "', `salt` = '" + salt + "' WHERE `id` = " + AccountId;
update.ExecuteNonQuery();
}
}
}
关于.net - MySQL Connector/NET 连接每个连接多个 DataReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685320/
我想为 python 3 使用 mysql-connector 库。我可以使用 pymysql 代替,但是 mysql-connector 已经有一个连接池实现,而 pymysql 似乎没有。所以我要
哈,我正在尝试在 asp.net 4 中将 CKFinder 与 ckeditor 一起使用,但出现此错误: Could not load type 'CKFinder.Connector.Conne
哈,我正在尝试在 asp.net 4 中将 CKFinder 与 ckeditor 一起使用,但出现此错误: Could not load type 'CKFinder.Connector.Conne
SAP Java 连接器 是否仍然是将 Java 应用程序与 SAP 连接的好方法?将来(尤其是在 ECC 6.0 中)是否会有连接器的支持和维护,或者是使用 ECC 6.0 中的“企业服务”的唯一好
我一直在使用 AzureLogicApp 中的 FTP 连接器将 FTP 服务器中的文件从源文件夹解压缩到目标文件夹。 我已将 FTP 连接器配置为在源文件夹中添加文件时触发。 我面临的问题是此处触发
我一直在使用 AzureLogicApp 中的 FTP 连接器将 FTP 服务器中的文件从源文件夹解压缩到目标文件夹。 我已将 FTP 连接器配置为在源文件夹中添加文件时触发。 我面临的问题是此处触发
1) sudo dpkg -i mysql-connector-python_1.0.12-1ubuntu12.04_all.deb 2) sudo dpkg -i mysql-utilities_1
导入 mysql.connector ModuleNotFoundError:没有名为“mysql.connector”的模块; 'mysql' 不是一个包 pip install mysql-con
我正在为我们的一位客户开发 C# 应用程序。我们已经定义了一些 IDOC 结构。所有规范都在 Excel 表格中。 所以问题是:是否可以从“IDOCTYPE_READ_COMPLETE”函数获取整个
我有这两个表:gantt_tasks 和 gantt_links,我成功将任务添加到第一个表,但如果我尝试添加链接,则会出现此错误。 java.lang.ClassCastException: com
我正在尝试在远程 tomcat 服务器(8.5.39)上部署我的 java 后台。为了使用 https,我在/conf/server.xml 上更改了这些行 我可以在远程服务器上运行t
当我安装mysql-connector-python 2.0.1-1时( http://dev.mysql.com/downloads/connector/python/ ) 在 Ubuntu 14.
为了在 SFTP 写入连接器中获取文件名,我已将文件名存储在变量中并写入文件(暂存),然后将其写入目录。从不同的流中,我需要将相同的文件移动到输出位置,两个流不是相互链接的。 Mule4 中没有 Se
我在 virtualbox 中使用 vagrant。将数据插入数据库时出现此错误。我尝试修复错误的事情: 清除所有缓存、路由和配置 确保我的 env 文件已配置(我已经尝试将 127.0.0.1
我正在准备第一次使用jdbc,并且正在为MySQL安装jdbc驱动程序。 但是,我不清楚将这些文件中的哪些移动到 Eclipse 中的 WEB_INF/lib 文件夹中。它们似乎都包含相同的内容,并一
我使用的是Eclipse Helios v3.6,每次启动时,都会显示以下对话框。但是我不使用颠覆。有人知道如何停止吗? 最佳答案 我遇到过同样的问题。要修复它,我进入了Eclipse插件目录,并搜索
我已经在mongodb服务器中安装了mongo-connector。 我通过发出命令来执行 mongo-connector -m [remote mongo server IP]:[remote mo
我使用的是 gnu/linux 系统,特别是 Fedora 21 64 位。我想通过终端系统启动我的arduino IDE,突然,这个错误出现了: Could not find agent libra
Mysql-connector-java驱动版本问题 由于我的数据库版本是5.7.28 ,在使用java连接mysql时经常出现版本问题。 com.mysql.jdbc.Driver 是
当前问题集: 包含 mysql_connector 对象的 Python 应用程序 只能使用 mysql 访问远程服务器(不能使用 ssh、rsh、telnet 等) 目标: 使用 mysql 连接器
我是一名优秀的程序员,十分优秀!