问题说明:使用的MySQL是5.1.37版本,用的mysql-connector-java-5.0.4.jar版本,在java文件中定义的字段是Date类型,MySQL中定义的字段类型是datetime类型的,

将List集合的数据写到一个Excel文件并导出示例:

本文出处:  

尝试了以下方式都不成功,报的错误还是一个,方法如下:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.IO;

 

1.第一个方法:

 

最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,
不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法
专业DBA以及熟悉数据库的同学请无视。

//  Date date = new Date();
//  shop.setLastEditTime(date);

  List<UserInfo> listUser = new
List<UserInfo>()
           {
               new UserInfo { name=”1″,
id=”1″, phone=”1r” },
               new UserInfo { name=”2″,
id=”2″, phone=”2r” },
               new UserInfo { name=”3″,
id=”3″, phone=”3r” },
               new UserInfo { name=”4″,
id=”4″, phone=”4r” },
               new UserInfo { name=”5″,
id=”5″, phone=”5r” },
           };
        1、//创建工作簿对象
       IWorkbook workbook = new
HSSFWorkbook();
        2、//创建工作表
        ISheet sheet =
workbook.CreateSheet(“onesheet”);
        IRow row0 =
sheet.CreateRow(0);
       
row0.CreateCell(0).SetCellValue(“用户Id”);
       
row0.CreateCell(1).SetCellValue(“用户名称”);
       
row0.CreateCell(2).SetCellValue(“用户备注信息”);
        for (int r = 1; r <
listUser.Count; r++)
        {
            3、//创建行row
            IRow row =
sheet.CreateRow(r);
           
row.CreateCell(0).SetCellValue(listUser[r].id);
           
row.CreateCell(1).SetCellValue(listUser[r].name);
           
row.CreateCell(2).SetCellValue(listUser[r].phone);
           
row.CreateCell(3).SetCellValue(listUser[r].pwd);
        }

 

2.第二个方法:

    //创建流对象并设置存储Excel文件的路径
        using (FileStream url =
File.OpenWrite(@”C:\Users\Administrator\Desktop\写入excel.xls”))
        {

废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
  Timestamp ts = new Timestamp(System.currentTimeMillis());
  String strDate = sdf.format(ts);
  shop.setLastEditTime(Timestamp.valueOf(strDate));

    //导出Excel文件
            workbook.Write(url);
           
Response.Write(“<script>alert(‘写入成功!’)</script>”);
        };

类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是常用的订单ID,客户ID,以及订单创建时间

后来百度查贴吧,说有可能是jar包版本冲突问题,但是原来代码时可以运行的,而此处不能运行,就尝试了把自己引入的包mysql-connector-java-5.0.4.jar换成高版本的,问题成功解决。

——————————分享End——————————

create table SaleOrder
(
    id       int identity(1,1),
    OrderNumber  int         ,
    CustomerId   varchar(20)      ,
    OrderDate    datetime         ,
    Remark       varchar(200)
)
GO
declare @i int=0
while @i<100000
begin
    insert into SaleOrder values (@i,CONCAT('C',cast(RAND()*1000 as int)),GETDATE()-RAND()*100,NEWID())
    set @i=@i+1
end
create index idx_OrderNumber on SaleOrder(OrderNumber)
create index idx_CustomerId on SaleOrder(CustomerId)
create index idx_OrderDate on SaleOrder(OrderDate)

后来又尝试了从哪个版本开始有问题的,原来是mysql-connector-java-5.0.5.jar开始后面的几个版本都好使。

 生成的测试数据大概就是这个样子的

换成高版本的几个jar包后,以上的两个方法都可以使用。

 图片 1

具体的原因不知道MySQL进行了什么优化,只是知道了解决的办法,有知道的欢迎来说下原因

 

 

 

下面演示说明几种常见的写法以及每种写法潜在的问题

 

 

第一种常见的写法:拼凑字符串,用EXEC的方式执行这个拼凑出来的字符串,不推荐

create proc pr_getOrederInfo_1
(
    @p_OrderNumber       int      ,
    @p_CustomerId        varchar(20) ,
    @p_OrderDateBegin    datetime   ,
    @p_OrderDateEnd      datetime
)
as
begin

    set nocount on;
    declare @strSql nvarchar(max);
    set @strSql= 'SELECT [id]
               ,[OrderNumber]
               ,[CustomerId]
               ,[OrderDate]
               ,[Remark]
            FROM [dbo].[SaleOrder] where 1=1 ';
    /*
        这种写法的特点在于将查询SQL拼凑成一个字符串,最后以EXEC的方式执行这个SQL字符串
    */

    if(@p_OrderNumber is not null)
        set @strSql = @strSql + ' and OrderNumber = ' + @p_OrderNumber
    if(@p_CustomerId is not null)
        set @strSql = @strSql + ' and CustomerId  = '+ ''''+ @p_CustomerId + ''''
    if(@p_OrderDateBegin is not null)
        set @strSql = @strSql + ' and OrderDate >= ' + '''' + cast(@p_OrderDateBegin as varchar(10)) + ''''
    if(@p_OrderDateEnd is not null)
        set @strSql = @strSql + ' and OrderDate <= ' + '''' + cast(@p_OrderDateEnd as varchar(10)) + ''''

    print @strSql
    exec(@strSql);

end

 

  假如我们查询CustomerId为88,在2016-10-1至2016-10-3这段时间内的订单信息,如下,带入参数执行

exec pr_getOrederInfo_1
    @p_OrderNumber      = null      ,
    @p_CustomerId       = 'C88'     ,
    @p_OrderDateBegin   = '2016-10-1' ,
    @p_OrderDateEnd     = '2016-10-3'

 

  首先说明,这种方式执行查询是完全没有问题的如下截图,结果也查出来了(当然结果也是没问题的)

图片 2

我们把执行的SQL打印出来,执行的SQL语句本身就是就是存储过程中拼凑出来的字符串,这么一个查询SQL字符串

SELECT [id]
    ,[OrderNumber]
    ,[CustomerId]
    ,[OrderDate]
    ,[Remark]
FROM [dbo].[SaleOrder] 
where 1=1  
    and CustomerId  = 'C88' 
    and OrderDate >= '2016-10-1' 
    and OrderDate <= '2016-10-3'

  

发表评论

电子邮件地址不会被公开。 必填项已用*标注