为何?用Linq排序的时候,int 类型字段可以...但是 float类型不行?何解?

Sharpend 2013-07-08 12:00:42
//先上我的代码吧(这个可以排序):
//按奖金的升序排序.
void OrderDataByPriceAscending(object sender, EventArgs e) {
var sorted = from employee in set.Tables["T_Employee"].AsEnumerable()
orderby employee.Field<int>("FAge") ascending
select employee;
dataGV.DataSource = sorted.AsDataView();
}


//(这个不可以排序)
//按奖金的升序排序.
void OrderDataByPriceAscending(object sender, EventArgs e) {
var sorted = from employee in set.Tables["T_Employee"].AsEnumerable()
orderby employee.Field<float>("FPrice") ascending
select employee;
dataGV.DataSource = sorted.AsDataView();
}

报错:
Specified cast is not valid.
大家看图就知道了,我的字段"FPrice"明明是 float 怎么说格式转换的时候出问题?

运行界面:

字段定义:

...全文
301 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
CqCoder 2013-07-08
  • 打赏
  • 举报
回复
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
貌似,数据库中的float 是对应C#中的 double... 而C#中的float,数据库中没有对应的类型....
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 2 楼 wddw1986 的回复:
数据库的float和C#里的float也不是一个float啊
无法转? 可否解释...
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 4 楼 moonwrite 的回复:
对table没有好感~~ 为什么不用实体类呢~
你是说 那个 LinqToSQLServer的 .dbml 类么? Table不好么?
moonwrite 2013-07-08
  • 打赏
  • 举报
回复
对table没有好感~~ 为什么不用实体类呢~
threenewbee 2013-07-08
  • 打赏
  • 举报
回复
不是float排序不行,而是你的字段没办法转换成float的。
cheng2005 2013-07-08
  • 打赏
  • 举报
回复
数据库的float和C#里的float也不是一个float啊
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
第一部分的代码,注释的应该是 "年龄"...这个不影响...
moonwrite 2013-07-08
  • 打赏
  • 举报
回复
另外是使用linq to sql么~ 如果可以的话 还是用EntityFrameword 两者差不多~
moonwrite 2013-07-08
  • 打赏
  • 举报
回复
引用 13 楼 Sharpend 的回复:
[quote=引用 10 楼 moonwrite 的回复:] [quote=引用 5 楼 Sharpend 的回复:] [quote=引用 4 楼 moonwrite 的回复:] 对table没有好感~~ 为什么不用实体类呢~
你是说 那个 LinqToSQLServer的 .dbml 类么? Table不好么?[/quote] ORM是个概念; Linq to sql其中的一种实现,LinqToSql已经不更新了,有更强大的EntityFramwork; 也可以自己简单第实现ORM,如下 public static List<Entity> GetData() { const string sql = ""; List<Entity> list = new List<Entity>(); using (SqlConnection conn = new SqlConnection(GlobalSetting.ConnectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Entity entity = new Entity(); entity.ID = Guid.Parse(dr["ID"].ToString()); ....//这部分可以使用CodeSmith生成 list.Add(entity); } } return list; } 返回的是强类型的数据集合,比Table好多~ 可以看看我科普的帖子 http://bbs.csdn.net/topics/390435776 [/quote] 我看了一下你的文档...也查了一下关于这个的概率... 这是我最近写的测试...你看看是不是你说的意思:
public partial class Form1: Form {
        private string _strConn = @"Data Source=.\SQLExpress;Initial Catalog=DB_Person;Integrated Security=True";    //连接字符串.
        private LinqToSQLServerAdderDataContext _linq;   //Linq对象.
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            ShowPerson();
        }

        private void btnAdd_Click(object sender, EventArgs e) {
            T_Person p = new T_Person();    //新增的对象.
            p.FName = txtName.Text;
            p.FAge = int.Parse(txtAge.Text);
            _linq.T_Persons.InsertOnSubmit(p);
            _linq.SubmitChanges();
            ShowPerson();   //新增后重显示.
        }

        //显示数据.
        void ShowPerson() {
            _linq = new LinqToSQLServerAdderDataContext(_strConn);
            var result = from person in _linq.T_Persons
                         select new {
                             序号 = person.FId,
                             姓名 = person.FName,
                             年龄 = person.FAge
                         };
            dataGV.DataSource = result;
        }
    }
[/quote] 是的,但如果有分层就更好了~ 搜搜 三层架构
EnForGrass 2013-07-08
  • 打赏
  • 举报
回复
个人觉得你数据库设计都有问题。Fprice既然是表示价格金额,就不应该用float类型,应该用decimal或者Number
qldsrx 2013-07-08
  • 打赏
  • 举报
回复
断点查看那个列的实际数据类型,不要想当然地转换,在不知道实际类型的情况下,你直接Cast<object>,然后用object排序也可以的。
  • 打赏
  • 举报
回复
C#中精度只有7位,上面说的那个超了
  • 打赏
  • 举报
回复
引用 7 楼 Sharpend 的回复:
貌似,数据库中的float 是对应C#中的 double... 而C#中的float,数据库中没有对应的类型....
这倒也不是,主要是两种类型的精确度不一样 当数据类型是Numeric(10, 6)这种时,应该就可以转成C#中的float,主要是精确度以及数值范围
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 10 楼 moonwrite 的回复:
[quote=引用 5 楼 Sharpend 的回复:] [quote=引用 4 楼 moonwrite 的回复:] 对table没有好感~~ 为什么不用实体类呢~
你是说 那个 LinqToSQLServer的 .dbml 类么? Table不好么?[/quote] ORM是个概念; Linq to sql其中的一种实现,LinqToSql已经不更新了,有更强大的EntityFramwork; 也可以自己简单第实现ORM,如下 public static List<Entity> GetData() { const string sql = ""; List<Entity> list = new List<Entity>(); using (SqlConnection conn = new SqlConnection(GlobalSetting.ConnectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Entity entity = new Entity(); entity.ID = Guid.Parse(dr["ID"].ToString()); ....//这部分可以使用CodeSmith生成 list.Add(entity); } } return list; } 返回的是强类型的数据集合,比Table好多~ 可以看看我科普的帖子 http://bbs.csdn.net/topics/390435776 [/quote] 我看了一下你的文档...也查了一下关于这个的概率... 这是我最近写的测试...你看看是不是你说的意思:
public partial class Form1: Form {
        private string _strConn = @"Data Source=.\SQLExpress;Initial Catalog=DB_Person;Integrated Security=True";    //连接字符串.
        private LinqToSQLServerAdderDataContext _linq;   //Linq对象.
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            ShowPerson();
        }

        private void btnAdd_Click(object sender, EventArgs e) {
            T_Person p = new T_Person();    //新增的对象.
            p.FName = txtName.Text;
            p.FAge = int.Parse(txtAge.Text);
            _linq.T_Persons.InsertOnSubmit(p);
            _linq.SubmitChanges();
            ShowPerson();   //新增后重显示.
        }

        //显示数据.
        void ShowPerson() {
            _linq = new LinqToSQLServerAdderDataContext(_strConn);
            var result = from person in _linq.T_Persons
                         select new {
                             序号 = person.FId,
                             姓名 = person.FName,
                             年龄 = person.FAge
                         };
            dataGV.DataSource = result;
        }
    }
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 10 楼 moonwrite 的回复:
[quote=引用 5 楼 Sharpend 的回复:] [quote=引用 4 楼 moonwrite 的回复:] 对table没有好感~~ 为什么不用实体类呢~
你是说 那个 LinqToSQLServer的 .dbml 类么? Table不好么?[/quote] ORM是个概念; Linq to sql其中的一种实现,LinqToSql已经不更新了,有更强大的EntityFramwork; 也可以自己简单第实现ORM,如下 public static List<Entity> GetData() { const string sql = ""; List<Entity> list = new List<Entity>(); using (SqlConnection conn = new SqlConnection(GlobalSetting.ConnectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Entity entity = new Entity(); entity.ID = Guid.Parse(dr["ID"].ToString()); ....//这部分可以使用CodeSmith生成 list.Add(entity); } } return list; } 返回的是强类型的数据集合,比Table好多~ 可以看看我科普的帖子 http://bbs.csdn.net/topics/390435776 [/quote] 你说到 "强数据类型"或称 Type DataSet ...我就懂了...不过我开始学C#的时候,在强数据类型用的是 .mdf数据库,如果托数据库表,让其生成的结构...不过...这个我没有用过...
maxldwy 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
不是float排序不行,而是你的字段没办法转换成float的。
+1
moonwrite 2013-07-08
  • 打赏
  • 举报
回复
引用 5 楼 Sharpend 的回复:
[quote=引用 4 楼 moonwrite 的回复:] 对table没有好感~~ 为什么不用实体类呢~
你是说 那个 LinqToSQLServer的 .dbml 类么? Table不好么?[/quote] ORM是个概念; Linq to sql其中的一种实现,LinqToSql已经不更新了,有更强大的EntityFramwork; 也可以自己简单第实现ORM,如下 public static List<Entity> GetData() { const string sql = ""; List<Entity> list = new List<Entity>(); using (SqlConnection conn = new SqlConnection(GlobalSetting.ConnectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Entity entity = new Entity(); entity.ID = Guid.Parse(dr["ID"].ToString()); ....//这部分可以使用CodeSmith生成 list.Add(entity); } } return list; } 返回的是强类型的数据集合,比Table好多~ 可以看看我科普的帖子 http://bbs.csdn.net/topics/390435776
Sharpend 2013-07-08
  • 打赏
  • 举报
回复
引用 8 楼 zxy397472251 的回复:
SQL Server类型与C#类型对应关系 http://www.cnblogs.com/abllyboy/archive/2010/11/11/1875122.html
Thank you....

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧