我收到了Specified cast is not valid.
,我找不到原因。这是我的代码。
对象图层。
public class Supervisor
{
public long ID { get; set; }
public string stringField1 { get; set; }
public string stringField2 { get; set; }
public string stringField3 { get; set; }
public int intField1{ get; set; }
public int intField2 { get; set; }
}
C#方法。
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string GetPend(string value1FromjqGrid, string value2FromjqGrid)
{
string query = "GetPend";
string supervisor = "";
Supervision _query = new Supervision();
DataTable dt = _query.GetSupervisorQuery(value1FromjqGrid, value2FromjqGrid, supervisor, query );
List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
select new Supervisor()
{
ID = dt1.Field<long>("ID"),
stringField1 = dt1.Field<string>("Linea"),
intField1 = dt1.Field<int>("Tiempo"),
intField2 = dt1.Field<int>("TIPOACTIVIDAD_ID"),
stringField2 = dt1.Field<string>("ACT_ID"),
stringField3 = dt1.Field<string>("OBS")
}).ToList();
var grid = new
{
page = 1,
records = lines.Count(),
total = lines.Count(),
rows = from item in lines
select new
{
id = item.ID,
cell = new string[]{
item.stringField1,
item.intField1.ToString(),
item.intField2.ToString(),
item.stringField2,
item.stringField3
}
}
};
return JsonConvert.SerializeObject(grid);
}
这或多或少。当LinQ
迭代开始时,它会崩溃。正如我选中的那样,DataTable
已正确填充,dt1
正确包含字段。我看到字符串列的""
和int's
的数字(我自己也完成了SQL存储过程,所以我也在那里进行了检查。)有了这个,我也保证了来自jqGrid
的2个参数都可以,但我仍然在调用之前就发出了一些警报,是的,它们没问题。
我已经粘贴了似乎相关的代码,因为当代码尝试将信息从DataTable
解析为List
时出现错误,如果您需要检查javascript这里涉及的只是让我知道,但我不认为这是必要的。
很明显,我没有看到任何东西,所以希望你能引导我朝着正确的方向前进。感谢。
PS。我试过在LINQPad4上查看它,但我不能试一试,因为我不知道如何在那里表示原始的DataTable变量。
更新
当我扩展错误时,这就是VS给我的。:
at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)
at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)
at WEB.Supervisor.<GetPend>b__b(DataRow dt1) in E:\Dev\VS\WEB\Supervisor.aspx.cs:line 110
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at WEB.Supervisor.GetPend(String value1FromjqGrid, String value2FromjqGrid) in E:\Dev\VS\WEB\Supervisor.aspx.cs:line 109
第109和110行是
List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
select new Supervisor()
它在转换过程的开始时崩溃。
更新2
根据评论我做了如下。
取出SELECT
并转为SELECT INTO
以生成垃圾桌。然后检查了它的设计,并且为了我的实际意外,字段CAST(ACT_ID AS NVARCHAR(50))
仍然是十进制的,而不是我预期的nvarchar。
所以,似乎我必须在LinQ
中以小数形式处理此问题,或者我可以做其他事情吗?我过去曾尝试与decimals
合作,但没有成功。
答案 0 :(得分:3)
数据库中的列类型与List<Supervisor> lines = (from dt1 in dt.AsEnumerable() select new Supervisor() {...}).ToList();
中使用的数据类型之间应该是类型不匹配。
在评论中进行一些对话后,我们可以看到"ACT_ID"
中database
的类型为十进制。因此,为了解决异常问题,可以执行以下操作:
List<Supervisor> lines = (from dt1 in dt.AsEnumerable()
select new Supervisor {
ID = dt1.Field<long>("ID"),
stringField1 = dt1.Field<string>("Linea"),
intField1 = dt1.Field<int>("Tiempo"),
intField2 = dt1.Field<int>("TIPOACTIVIDAD_ID"),
stringField2 = dt1.Field<decimal>("ACT_ID").ToString(),
stringField3 = dt1.Field<string>("OBS")
}).ToList();