【问题标题】:Task<DataTable> does not contain definition for 'Rows'Task<DataTable> 不包含“行”的定义
【发布时间】:2019-03-22 08:49:23
【问题描述】:

我有这段代码可以从数据库中获取数据

public async Task<DataTable> SelectData(string stored_procedure, SqlParameter[] param)
    {
        SqlCommand sqlcmd = new SqlCommand();
        sqlcmd.CommandType = CommandType.StoredProcedure;
        sqlcmd.CommandText = stored_procedure;
        sqlcmd.Connection = sqlconnection;
        if (param != null)
        {
            sqlcmd.Parameters.AddRange(param);
        }

        SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
        DataTable dt = new DataTable();
        await Task.Run(()=> da.Fill(dt));
        return dt;
    }

我使用这段代码来运行存储过程

public async Task<DataTable> GetOrderManagementManagerEmail()
    {
        DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
        DataTable dt = new DataTable();
        dt =await DAL.SelectData("GetOrderManagementManagerEmail", null);
        DAL.Close();
        return dt;
    }

然后我通过单击按钮使用此代码

private async void btnValidate_Click(object sender, EventArgs e)
    {
        int[] selectedRows = gridView2.GetSelectedRows();
        for (int i = 0; i < selectedRows.Length; i++)
        {
            DataRow rowGridView2 = (gridView2.GetRow(selectedRows[i]) as DataRowView).Row;
          await  stock.ValidateProjectNeed(Convert.ToInt32(rowGridView2["id"]), DateTime.Now);
        }
        if (XtraMessageBox.Show(Resources.addedSuccessfullyBonBesoinAndSendEmail, Resources.Validate, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
        {


            Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
            Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
            Recipients oRecips = oMsg.Recipients;

            oMsg.To =await Task.Run(()=> stock.GetOrderManagementManagerEmail().Rows[0][0].ToString());
            oMsg.Subject = "Bon Besoin " ;
            oMsg.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
            oMsg.Display(false); //In order to display it in modal inspector change the argument to true
            oMsg.HTMLBody = "Un nouveau bon besoin a été ajouté " +
                "<br />" +  oMsg.HTMLBody; //Here comes your body;

        }
        gridControl2.DataSource = stock.GetProjectNeedsForValidate();
    }

但我在这行代码中遇到错误

oMsg.To =await Task.Run(()=> stock.GetOrderManagementManagerEmail().Rows[0][0].ToString());

Task 不包含“Rows”的定义,并且找不到接受“Task”类型的第一个参数的可访问扩展方法“Rows”(您是否缺少 using 指令或程序集引用?)。 在我使用异步之前,代码工作正常。提前致谢。

【问题讨论】:

  • stock.GetOrderManagementManagerEmail() 可能是一个异步方法,它返回 Task&lt;DataTable&gt; 这不是一个 DataTable,您需要异步匿名方法,像这样:async () =&gt; ... 或使用这样的结果stock.GetOrderManagementManagerEmail().Result.Rows... 请记住,使用 Result 属性是一个阻塞调用
  • 为什么你使用await?无论如何,GetOrderManagementManagerEmail() 返回一个任务。 DataTable 存储在任务的Result 属性中。 Task.Result 是一个阻塞调用。请改用简单的var table = await stock.GetOrderManagementManagerEmail()
  • 我强烈建议重新访问此处的数据访问。您将看似共享的连接对象和现有的数据访问方法结合在一起,而该连接直到被其他任务使用。共享连接字符串,而不是连接对象,如果可能,使用内置的XxxAsync 方法而不是使用Task.RunTask.Run 有一个地方。不是这个。
  • @MindSwipe “stock.GetOrderManagementManagerEmail() 可能是一个异步方法”实际上就是这样。它发布在问题中

标签: c# winforms


【解决方案1】:

你想要:

var table = await stock.GetOrderManagementManagerEmail();
oMsg.To = table.Rows[0][0].ToString();

不确定await Task.Run() 发生了什么。您从对GetOrderManagementManagerEmail() 的调用中获得了Task,然后尝试从任务中检索行,并包装在...中。

简化它。另外,看看您是否真的需要使用带有索引器的表/行。您可以使用:

var oMsg.To = table.AsEnumerable().Select(d => d.Field<string>("To")).FirstOrDefault();

【讨论】:

  • 解释为什么首先出现错误以及为什么您的解决方案能够解决它,这将真正提高您的答案质量,并且可以证明我刚刚给您的赞成票是合理的 ;)
  • @MongZhu 是的,我同意,我正在写一个 :-) 但尽量客观。
  • @MongZhu :-D 我的意思是,不知道为什么会这样写。我的作品充满了失败的幽默。
  • :好的,但是我的评论是错误的。我刚试过。实际上,编译器足够聪明,可以推断出Run&lt;T&gt; 的返回类型/泛型参数,并且它确实完成了这项工作,但它仍然是必要的异步的两倍
  • 感谢您的参与并帮我解决了我的问题,非常感谢。
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多