我想返回调用者的值,例如asd“列名”,但我得到一个错误,下面的示例/代码。
我有这个代码
public static MySqlDataReader QueryResultadoMultString(string Query)
{
using (var conn = new MySqlConnection(myConnectionString))
{
try
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = Query;
MySqlDataReader myReader = null;
myReader = cmd.ExecuteReader();
if (myReader.HasRows)
{
while (myReader.Read())
{
Console.WriteLine(myReader.GetString(0));
return myReader;
}
}
return myReader;
}
catch (MySqlException ex)
{
NAPI.Util.ConsoleOutput($"[BaseDados][Erro] {ex.Message}");
return null;
}
}
}下面的是调用方
var asd = BaseDadosSQL.QueryResultadoMultString($"SELECT `socialclub`,`username`,`password` FROM contas WHERE socialclub = '{player.SocialClubName}'");
Console.WriteLine("Result "+asd["username"]);我得到了这个错误
System.Exception:“数据读取器中没有当前查询”
发布于 2019-12-04 01:28:22
编写的方法将迫使您编写容易受到sql注入问题影响的代码。您需要为参数单独设置一组参数。
您需要更像这样的东西(这也应该解决问题中的问题):
public static class BaseDadosSQL
{
private static string connectionString = "connection string here";
public static IEnumerable<IDataRecord> QueryResult(string Query, params MySqlParameter[] parameters)
{
using (var conn = new MySqlConnection(connectionString))
using (var cmd = new MySqlCommand(Query, conn))
{
if (parameters is object && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return reader;
}
}
}
}
}然后这样称呼它:
//Guessing at type and length here. Use the actual type and length from the database
var p = new MySqlParameter("@SocialClub", MySqlDbType.VarString, 20);
p.Value = player.SocialClubName;
try
{
var asd = BaseDadosSQL.QueryResult($"SELECT `socialclub`,`username`,`password` FROM contas WHERE socialclub = @SocialClub", p);
foreach(var result in asd)
{
Console.WriteLine("Result " + result["username"]);
}
}
catch (MySqlException ex)
{
NAPI.Util.ConsoleOutput($"[BaseDados][Erro] {ex.Message}");
},这段代码将允许你使用社交俱乐部的名字,其中包括撇号。,原来的可能已经爆炸了。注意,我还将异常处理移出DB代码。
理想情况下,即使是QueryResult()方法也应该是private,对于需要运行的每个查询,BaseDadosSQL类都有一个单独的public方法。所以看起来更像这样:
public static class BaseDadosSQL
{
private static string connectionString = "connection string here";
private static IEnumerable<IDataRecord> QueryResult(string Query, params MySqlParameter[] parameters)
{
using (var conn = new MySqlConnection(connectionString))
using (var cmd = new MySqlCommand(Query, conn))
{
if (parameters is object && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return reader;
}
}
}
}
public static IEnumerable<IDataRecord> GetClubLogin(string clubName)
{
//Still guessing at type and length here.
var p = new MySqlParameter("@SocialClub", MySqlDbType.VarString, 20);
p.Value = clubName;
return QueryResult($"SELECT `socialclub`,`username`,`password` FROM contas WHERE socialclub = @SocialClub", p);
}
}然后像这样叫:
try
{
foreach(var result in BaseDadosSQL.GetClubLogin(player.SocialClubName))
{
Console.WriteLine("Result " + result["username"]);
}
}
catch (MySqlException ex)
{
NAPI.Util.ConsoleOutput($"[BaseDados][Erro] {ex.Message}");
}最后,存储这样的密码真的是非常糟糕的。太糟糕了,对概念代码的测试/学习/验证甚至都是不允许的。千万别那么做!存储加密的密码是不可能的。加密还不够好。
密码只应作为一个固定长度、咸的、加密的(非MD5)哈希值存储.当有人尝试登录时,您将尝试的凭据进行盐分和散列,然后比较哈希值,而不是实际密码。其他任何事情都只是乞求在你选择的报纸的头版上,作为最新的大数据泄露。
https://stackoverflow.com/questions/59167264
复制相似问题