【发布时间】: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