欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#处理MySql多个返回集的方法

程序员文章站 2023-12-15 08:43:28
本文实例讲述了c#处理mysql多个返回集的方法。分享给大家供大家参考。具体方法如下: 关于mysql返回多个集java和php的较多,但是c#的完整代码好像没见过,研究...

本文实例讲述了c#处理mysql多个返回集的方法。分享给大家供大家参考。具体方法如下:

关于mysql返回多个集java和php的较多,但是c#的完整代码好像没见过,研究了一下做个封装以后用

做一个mysql的简单分页查询,有两个返回集

sql语句如下

复制代码 代码如下:
select count(*) from  poster;
select
    t.posterid,
    t.posttime,
    t.title
 from app_us_poster t order by t.posttime desc limit startpagenum,endpagenum;

这里mysql中返回是两个集,如何通过c#获取这两个值呢,需要用到mysqldataadapter和mysqldatareader这两个类

查看mysqldataadapter类

C#处理MySql多个返回集的方法

现在多了很多fillasync的方法,用的task异步写入。关于task的实例可以参看这篇博客,各种例子是很好的

可以看到里面有我们需要的方法哈,那就是

复制代码 代码如下:
public task<int> fillasync(datatable datatable, idatareader datareader);

如果想添加取消操作的可以用
复制代码 代码如下:
public task<int> fillasync(datatable datatable, idatareader datareader, cancellationtoken cancellationtoken)

mysqldatareader是有一个nextresult的方法可以用来循环读取返回集,并返回bool类型

思路就出来了,通过判断nextresult的结果是否为false,来结束返回集的查询,通过mysqldataadapter类的fillasync的方法对每个结果进行填充

复制代码 代码如下:
/// <summary>
/// 读取多个返回集,返回list<datatable>
/// </summary>
/// <param name="storedname"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public list<datatable> stroedgettablelist(string storedname, list<sqlparameters> parameters)
{

    mysqldataadapter mysqldata = new mysqldataadapter();
    mysqlcommand sqlcommand = new mysqlcommand();
    sqlcommand.commandtext = storedname;//存储过程名称
    sqlcommand.commandtype = commandtype.storedprocedure;
    sqlcommand.connection = conn;

    for (int i = 0; i < parameters.count; i++)
    {
 sqlcommand.parameters.addwithvalue(parameters[i].name, parameters[i].pvalue);
    }
    conn.open();
    list<datatable> dts = new list<datatable>();
    mysqldatareader mysqlreser = sqlcommand.executereader();//mysqlreader无构造函数
    bool re = true;
    system.threading.cancellationtoken _cts;//用于cancel用的
    while (re)
    {
 datatable dt = new datatable();
 mysqldata.fillasync(dt, mysqlreser).wait(_cts);//等待线程完成
   dts.add(dt);
 re = mysqlreser.nextresult();//取下一个结果集
      //  trace.writeline(dt.rows.count);       

    }
    conn.close();
    return dts;
}

这里我用的阻塞主线程等待dt完成填充,不知道是否合适

复制代码 代码如下:
mysqldata.fillasync(dt, mysqlreser).wait(_cts);//等待线程完成

补充一下

conn是连接数据库用的连接实例mysqlconnection

sqlparameters是我声明的一个结构体,用来保存mysql的存储过程的输入参数

复制代码 代码如下:
public struct sqlparameters
{
        public string name;//存储过程的输入字符名称
        public object pvalue;//存储过程的输入变量
        public sqlparameters(string names, object pvalues)
        {
            name = names;
            pvalue = pvalues;
        }
}

希望本文所述对大家的c#程序设计有所帮助。

上一篇:

下一篇: