先贴代码 StringBuilder sql2 = new StringBuilder();
            sql2.Append("SELECT info.*,fkid");
            DataSet lin = SqliteHelper.getDataset(sqlconn.conn, CommandType.Text, "select * from monthset", null);
            DataTable dt = lin.Tables[0];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                sql2.Append(",[L" + dt.Rows[i]["monthname"].ToString() + "]");
                sql2.Append(",[J" + dt.Rows[i]["monthname"].ToString() + "]");
            }
            sql2.Append("FROM info left join (");
            sql2.Append("select fkid,");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                sql2.Append("max(case smonth when '" + dt.Rows[i]["monthname"].ToString() + "' then sbyl else 0 end) as [L" + dt.Rows[i]["monthname"].ToString() + "],");
                sql2.Append("max(case smonth when '" + dt.Rows[i]["monthname"].ToString() + "' then sbenjia else 0 end) as [J" + dt.Rows[i]["monthname"].ToString() + "],");
            }
            sql2.Remove(sql2.Length - 1, 1);
            sql2.Append(" from submonth group by fkid) as tb on id=tb.fkid ");
            try
            {
                ds = SqliteHelper.getDataset(sqlconn.conn, CommandType.Text, sql2.ToString(), null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "读取资料错误");
            }
其中名为lin的DataSet只有一列,值为201010,201011,201101等,查询完成后,使用ds.Tables[0].NewRow();来添加行就会报错:无效的存储类型DBNULL;上午用的时候还是可以的完全没有问题。下午就再也不行了,通过查看DataTable的列,发现通过case when 转换的列的类型是这样的:DataType = {Name = DBNull FullName = System.DBNull },求解惑啊。

解决方案 »

  1.   

    数据类型不对,如果是NULL就正确了,把Sql贴出来和你数据库字段对比一下。应该是你哪里把数据类型搞错了!
      

  2.   

    在查询的时候,如果为数据库的空值,做下处理
    select isnull(id,0) from usertable 如果为null 返回0
      

  3.   

    sql是这个样子的SELECT info.*,fkid,[L201010],[J201010],[L201011],[J201011],[L201012],[J201012],[L201101],[J201101] FROM info left join (select fkid,max(case smonth when '201010' then sbyl else 0 end) as [L201010],max(case smonth when '201010' then sbenjia else 0 end) as [J201010],max(case smonth when '201011' then sbyl else 0 end) as [L201011],max(case smonth when '201011' then sbenjia else 0 end) as [J201011],max(case smonth when '201012' then sbyl else 0 end) as [L201012],max(case smonth when '201012' then sbenjia else 0 end) as [J201012],max(case smonth when '201101' then sbyl else 0 end) as [L201101],max(case smonth when '201101' then sbenjia else 0 end) as [J201101] from submonth group by fkid) as tb on id=tb.fkid 
      

  4.   

    SELECT info.*,fkid,[L201010],[J201010],[L201011],[J201011],[L201012],[J201012],[L201101],[J201101] 
    FROM info left join (select fkid,max(case smonth when '201010' then sbyl else 0 end) as [L201010],
    max(case smonth when '201010' then sbenjia else 0 end) as [J201010],max(case smonth when '201011' then sbyl else 0 end) as [L201011],
    max(case smonth when '201011' then sbenjia else 0 end) as [J201011],max(case smonth when '201012' then sbyl else 0 end) as [L201012],
    max(case smonth when '201012' then sbenjia else 0 end) as [J201012],max(case smonth when '201101' then sbyl else 0 end) as [L201101],
    max(case smonth when '201101' then sbenjia else 0 end) as [J201101] from submonth group by fkid) as tb on id=tb.fkid 
      

  5.   

    smonth这个数据是什么类型的?
      

  6.   

    smonth是varchar,另两个是float类型的
      

  7.   


    case  end 的语法 不是  case  when a=b then  else c end 吗  难道  case a when b then  else c end  这样也行
    我试试先