我收到此错误无法将字符串隐式转换为 system.data.datatable

Posted

技术标签:

【中文标题】我收到此错误无法将字符串隐式转换为 system.data.datatable【英文标题】:I am getting this error cannot implicitly convert string to 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 ...)。只有你知道你需要哪一个。 【参考方案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 事件中执行数据库操作。

【讨论】:

以上是关于我收到此错误无法将字符串隐式转换为 system.data.datatable的主要内容,如果未能解决你的问题,请参考以下文章

无法隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换

向启用文本框 (C#) 的 Web 部件添加按钮,出现错误:无法将类型“bool”隐式转换为“字符串”

错误128无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”

没有使用回形针将 Nil 隐式转换为字符串错误

无法将类型“System.DateTime”隐式转换为“string”是啥意思?怎么改正?

asp.net 无法将类型“System.DateTime”隐式转换为“string”