c# - MySQL Parameters.AddWithValue 不工作 C#
问题描述
我一直在尝试编写连接代码以连接数据库。进展顺利,但我遇到了一个我似乎无法解决的奇怪问题。
当我尝试向查询中添加参数时,它不会检索数据。但是当我切换参数时,它确实检索到了正确的数据。
数据访问层如下所示。(我知道这很不安全,但我才刚刚开始):
public static class UserDA
{
private static MySqlCommand cmd = null;
private static DataTable dt;
private static MySqlDataAdapter da;
public static User RetrieveUser(String username)
{
// Create the query
const String query = "SELECT `Username`, `Password` FROM login WHERE `Username` = '@Username';";
cmd = DbHelper.Select(
query,
new Dictionary<String, String>
{
{"@Username", username}
});
//Setup model
User user = null;
if (cmd == null) return null;
// Get the data and add it to the user model
dt = new DataTable();
da = new MySqlDataAdapter(cmd);
da.Fill(dt);
foreach (DataRow dataRow in dt.Rows)
{
user = new Models.User(
dataRow["Username"].ToString(),
dataRow["Password"].ToString());
}
return user;
}
}
Select 方法如下所示:
public static class DbHelper
{
private static MySqlConnection _connection;
private static MySqlCommand _cmd;
private static DataTable _dataTable;
private static MySqlDataAdapter _adapter;
public static void EstablishConnection()
{
// Gets a connection to the database. Code works.
}
/// <summary>
/// Give the query and a dict with the param name and value
/// </summary>
public static MySqlCommand Select(String query, Dictionary<String , String> param)
{
try
{
if (_connection != null)
{
_connection.Open();
_cmd = _connection.CreateCommand();
_cmd.CommandType = CommandType.Text;
_cmd.CommandText = query;
foreach (KeyValuePair<String, String> keyValuePair in param)
{
_cmd.Parameters.AddWithValue(keyValuePair.Key, keyValuePair.Value);
}
_cmd.ExecuteScalar();
_connection.Close();
}
}
catch (Exception e)
{
_connection?.Close();
}
return _cmd;
}
}
最后是用户模型:
public class User
{
public String Username;
public String Password;
public User(String username = "", String password = "")
{
Username = username;
Password = password;
}
}
当我尝试从中获取数据时会出现问题。如果我使用带有参数的选择查询,它不起作用,但只要我将参数更改为实际值,它就会很好地检索它。在这一点上,我真的很挠头。我是不是在某个地方忘记了一步?
谢谢!
解决方案
尝试删除 SQL 代码中 @Username 周围的引号。
前
SELECT `Username`, `Password` FROM login WHERE `Username` = '@Username';
后
SELECT `Username`, `Password` FROM login WHERE `Username` = @Username;
如果这不起作用,请尝试将您的字典从 <String, String> 更改为 <string, string>。
推荐阅读
- r - R read_excel:如何关联 range=cell_cols 和 cell_type
- apache-kafka - 有什么方法可以调整 Kafka Connect 中的消费者配置吗?
- php - 尝试显示 Nuxeo 文档时返回不可读的内容
- c++ - 在pcl中使用协方差矩阵获取点云平面簇的原点和方向
- elasticsearch - 如何在elasticsearch上使用join
- javascript - 使用 javascript 查找页面上的所有非导航链接
- c++ - 编译的 C++ 版本不输出也不提供错误
- node.js - 使用 postgres 触发器的多个数据问题
- macos - 在 MacBook 上的 IntelliJ 中运行 JavaFX 项目时的安全警告
- java - 如何在 ItemList.Builder (Android- Auto) 中添加超过 6 个项目?