1

当我执行以下代码时,我收到一条错误消息。

System.InvalidCastException: Specified cast is not valid.
   at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)
   at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)
   at ProbabilityFunctions.Program.Main(String[] args) in C:\Users\....:line 38Press any key to continue . . .

我在这段代码中试图做的是,我从一个表中检索数据并将其存储到另一个表中。我将此表作为参数传递给分类器以进行进一步操作。请告诉我错误。height,uname 的数据类型是 varchar... 其他是 int...

using System;
    using System.Data;
    using MySql.Data.MySqlClient;

    namespace ProbabilityFunctions
    {
        public class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    String con = "SERVER=localhost;DATABASE=sample;UID=root;password=password";
                    MySqlConnection conn = new MySqlConnection(con);
                    String s = "select * from cart";
                    MySqlCommand cmd = conn.CreateCommand();
                    MySqlCommand cmd2 = conn.CreateCommand();
                    cmd2.CommandText = "select count(*) from cart";
                    conn.Open();
                    int z = Convert.ToInt32(cmd2.ExecuteScalar());

                    conn.Close();
                    MySqlDataAdapter dat = new MySqlDataAdapter(s, conn);
                    DataTable tbl = new DataTable();

                    dat.Fill(tbl);
                    cmd.CommandText = s;
                    DataTable table = new DataTable();
                    table.Columns.Add("name");
                    table.Columns.Add("Height", typeof(double));
                    table.Columns.Add("cost", typeof(double));
                    table.Columns.Add("FootSize", typeof(double));


                    for (int i = 0; i < z; i++)
                    {
                        DataRow row = tbl.Rows[i];
                        Double height = row.Field<Double>("height");
                        Double fsize = row.Field<Double>("fsize");
                        Double cost = row.Field<Double>("cost");
                        String uname = row.Field<String>("uname");
                        table.Rows.Add(uname, height, cost, fsize);
                    }


                    Classifier classifier = new Classifier();
                    classifier.TrainClassifier(table);

                    Console.WriteLine(classifier.Classify(new double[] { 4, 150, 12 }));
                    Console.Read();
                }
                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                }
                }
        }
    }
4

2 回答 2

4

这可能发生在以下行之一上:

Double height = row.Field<Double>("height");
Double fsize = row.Field<Double>("fsize");
Double cost = row.Field<Double>("cost");

如果基础字段类型不能直接转换为双精度,您将收到此异常。从 的文档中Field<T>,InvalidCastException 在以下情况下抛出:

基础列的值类型无法转换为泛型参数 T 指定的类型。

鉴于堆栈跟踪,看起来基础表中的“高度”列实际上不是数字,并且不能转换为双精度。例如,如果它在输入数据集中存储为字符串,则必须提取字符串并随后转换为双精度。

于 2013-11-11T18:05:35.497 回答
1

现在很清楚了。您不能拆箱装箱intdouble或任何其他类型。仅允许的可能类型是intNullable<int>

获取 Field as int 然后将其转换为 double ,它应该可以工作

double height = (double)row.Field<int>("height");
于 2013-11-11T18:10:54.857 回答