首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回MySqlDataReader

返回MySqlDataReader
EN

Stack Overflow用户
提问于 2019-12-04 00:17:37
回答 1查看 224关注 0票数 1

我想返回调用者的值,例如asd“列名”,但我得到一个错误,下面的示例/代码。

我有这个代码

代码语言:javascript
复制
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;
            }
        }
    }

下面的是调用方

代码语言:javascript
复制
var asd = BaseDadosSQL.QueryResultadoMultString($"SELECT `socialclub`,`username`,`password` FROM contas WHERE socialclub = '{player.SocialClubName}'");
Console.WriteLine("Result "+asd["username"]);

我得到了这个错误

System.Exception:“数据读取器中没有当前查询”

EN

回答 1

Stack Overflow用户

发布于 2019-12-04 01:28:22

编写的方法将迫使您编写容易受到sql注入问题影响的代码。您需要为参数单独设置一组参数。

您需要更像这样的东西(这也应该解决问题中的问题):

代码语言:javascript
复制
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;
                }
            }
        }
    }
}

然后这样称呼它:

代码语言:javascript
复制
//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方法。所以看起来更像这样:

代码语言:javascript
复制
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); 
    }
}

然后像这样叫:

代码语言:javascript
复制
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)哈希值存储.当有人尝试登录时,您将尝试的凭据进行盐分和散列,然后比较哈希值,而不是实际密码。其他任何事情都只是乞求在你选择的报纸的头版上,作为最新的大数据泄露。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59167264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档