【问题标题】:I am getting this error cannot implicitly convert string to system.data.datatable我收到此错误无法将字符串隐式转换为 system.data.datatable
【发布时间】:2019-09-04 11:42:36
【问题描述】:

从组合选择的值将其传递给存储过程并使用序列化来生成条形图仪表板。但它向我显示了一个错误

无法将字符串隐式转换为 system.data.datatable

使用DataTable和序列化

这一行出错

return serializer.Serialize(rows);

.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;



namespace VOT.DashboardPages
{
    public partial class Velocity : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
                using (SqlConnection con = new SqlConnection(constr))
                {
                    using (SqlCommand cmd = new SqlCommand("SELECT ProjectNo FROM [dbo].[ProjectPlan] ORDER BY ProjectNo asc"))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = con;
                        con.Open();
                        ddlProjectNo.DataSource = cmd.ExecuteReader();
                        ddlProjectNo.DataTextField = "ProjectNo";
                        ddlProjectNo.DataValueField = "ProjectNo";
                        ddlProjectNo.DataBind();
                        con.Close();
                    }
                }
                ddlProjectNo.Items.Insert(0, new ListItem("--Select ProjectNo--", "0"));
            }
        }

            public DataTable BindData(String prjNo)
            {
                DataTable dt = new DataTable();
                SqlConnection connection = new SqlConnection("constr");
                try
                {
                    connection.Open();
                    SqlCommand sqlcmd = new SqlCommand("VelocityByOperationType", connection);
                    sqlcmd.CommandType = CommandType.StoredProcedure;
                    SqlDataAdapter sqlDa = new SqlDataAdapter(sqlcmd);
                    sqlcmd.Parameters.AddWithValue("@prjNo", prjNo);
                    sqlDa.Fill(dt);
                    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

                    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();

                    Dictionary<string, object> row;
                    foreach (DataRow dr in dt.Rows)
                    {
                        row = new Dictionary<string, object>();
                        foreach (DataColumn col in dt.Columns)
                        {
                            row.Add(col.ColumnName, dr[col]);
                        }
                          rows.Add(row);
                    }

                    return serializer.Serialize(rows);

               }
                finally
                {
                    connection.Close();
                }
            }


    protected void ddlProjectNo_SelectedIndexChanged(object Sender,EventArgs e)
    {
        TextBox1.Text = ddlProjectNo.SelectedItem.Value;
        DataTable dt = BindData(ddlProjectNo.SelectedItem.Value);
        //if(dt.Rows.Count>0)
        //{

        //}
    }
}

}

【问题讨论】:

  • 请仔细阅读错误。查看BindData方法的返回类型,以及Serialize方法的返回类型。有偏差,不是吗? serializer.Serialize 返回 string,但您已声明 BindData 返回 DataTable。 .NET 不知道如何将返回的string 转换为所需的DataTable
  • 你能建议如何重写这段代码吗?对我很有帮助
  • 我不能。您应该返回您读取的DataTable 以满足您的方法的签名(public DataTable ...),或者您应该继续返回序列化数据并更改您的签名以匹配(public string ...)。只有你知道你需要哪一个。

标签: c# sql .net sql-server datatable


【解决方案1】:

Serialize 方法返回一个字符串,而不是一个 DataTable。

如果要从方法中返回 DataTable,则需要将返回的变量(第 68 行)替换为以下内容:

return dt;

这将在调用时从方法返回填充的 DataTable 和 DataRows。

例如,如果您想返回 DataRows 的序列化字符串,则需要将方法签名从 DataTable 更改为字符串或创建新方法。

public string ReturnSerialisedData()
{
    // Add data table code here
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Serialize(rows);
}

作为附加说明,您可能希望将代码分成更多的服务/数据访问层,而不是直接在 Page_Load 事件中执行数据库操作。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2016-11-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多