3.操作相比较,说有相当的大大概是jar包版本争辩

2019-08-30 作者:数据库   |   浏览(194)

原文出处:

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

背景

我们知道Azure Sql Database 可以降低运维成本、是一种Pass模式,有资源弹性设置,可以自由调整资源自动对应不同业务高峰(当然也可以降低费用成本),也方便项目后期的资源扩展,以及一些其他优点或特性,这就不一一列出。那么数据库开发工程师来说,操作Azure Sql Database 与我们使用的SSMS(Microsoft Sql Server Management Studio)在本地库上操作有哪些区别。

 

我们简单从如下几部分进行比较

1.创建对象比较;(简单列一下Azure 上创建数据库操作,SSMS创建数据库默认省略)

2.连接库比较;

3.操作比较;

 

 using (FileStream fileReader = File.OpenRead(@"C:UsersAdministratorDesktop112.xls"))
        {
            //创建工作簿对象接收文件流(Excel信息)
            IWorkbook workbook = new HSSFWorkbook(fileReader);
            //工作簿共有几个表
            //int count = workbook.NumberOfSheets;
            //创建工作表读取工作簿表信息
            //ISheet sheet= workbook.GetSheet("表名称");
            ISheet sheet = workbook.GetSheetAt(0);
            string sql = @" insert into T_ExcelIn(Name,Remarks) values (@Name,@Remarks)";
            int ii = 0;
            //r = 1,剔除表头一行
            for (int r = 1; r <= sheet.LastRowNum; r )
            {
                //定义参数数组para
                SqlParameter[] para = new SqlParameter[] {
                    new SqlParameter("Name",SqlDbType.NVarChar,50),
                    new SqlParameter("Remarks",SqlDbType.NVarChar,50)
                };
                //创建一行获取sheet行数据
                IRow row = sheet.GetRow(r);
                List<ICell> listcell = new List<ICell>();
                //int c = 1 即不读取自动编号的Id列
                for (int c = 1; c < row.LastCellNum; c )
                {
                    //将每行每个单元格的值添加带listcell集合中
                    listcell.Add(row.GetCell(c));
                }
                //循环赋值给para
                for (int i = 0; i < listcell.Count; i )
                {
                    para[i].Value = listcell[i].ToString();
                }
                //执行添加Sql语句
                ii = SqlHelper.ExecuteNonQuery(sql, para);
               
            }
            if (ii > 0)
            {
                Response.Write("<script>alert('已将Excel数据插入到数据库表')</script>");
            }
            else
            {
                Response.Write("<script>alert('Excel数据插入到数据库表失败!')</script>");
            }

 

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

1.创建对象比较

 图片 1

 

 

 图片 2

 图片 3

图片 4

 

 图片 5

 

 图片 6

图片 7

        }

 

1.第一个方法:

2.链接库的比较

图片 8

 

图片 9

图片 10

通过上述图可以看到,在azure sql database 中涉及到实例一级的对象都是没有了。

在azure sql database大概总结如下:

1.没有 AlwaysON,没有数据库镜像,没有日志传送,没有复制。 有异地复制可以直接添加数据库辅助副本(库大小是指数据文件大小);

2.没有 agent ;如需执行定时调度可以参考《通过本地Agent监控Azure_sql_database》

3.没有SSIS;

4.不支持实例一级的对象(如不支持全局临时表、没有Profiler等);如需监控可以参考《如何在Azure sql database 下监控正在运行的脚本或某个存储过程是否已运行》

 

 

先看常用的一种表结构设计方式:

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

3.具体操作方面比较

 图片 11

 通过上图发现azure sql database系统数据库中没有tempdb,那能否使用临时表之类的对象?

首先查看当前的azure sql database 版本号

图片 12

 测试临时表(不是sql server 2016 temporal table)

 图片 13

图片 14

可以使用临时表,不支持使用全局的临时表。

图片 15

 Pass模式下,某些命令已不支持。

图片 16

 注意默认的getdate()是UTC时间,与北京时间相差8小时。

图片 17

 不能在本库显式调用其他库,如:use master

 

默认情况下,azure sql database 不支持跨库操作,需要创建扩展表,建同构同名的表,只能是只读且架构唯一。如要存储过程进行跨库操作,需使用sp_execute_remote调用。

 

ssms 2012界面下存储过程点右键如下图:

图片 18

SSMS 2016界面下存储过程点右键如下图:

图片 19

UI界面操作,建议安装最新版本SSMS.或者 exec sp_helptext 加具体的存储过程名称,执行,把执行结果拷出才是存储过程的脚本;

 

参考资料

如何创建扩展表

sp_execute_remote

————————————参数传递不经过List<>集合————————————

图片 20

2.第二个方法:

总结

azure sql database 与ssms相比:

1.没有 AlwaysON,没有数据库镜像,没有日志传送,没有复制。 有异地复制可以直接添加数据库辅助副本(库大小是指数据文件大小);

2.没有 agent ;如需执行定时调度可以参考《通过本地Agent监控Azure sql database》

3.没有SSIS;

4.不支持实例一级的对象(例如不支持全局变量、没有Profiler等);如需监控可以参考《如何在Azure sql database 下监控正在运行的脚本或某个存储过程是否已运行》

5.有些命令不支持,因azure sql database 是Pass模式;

6.注意默认getdate()是取UTC时间,与北京时间相差8小时;

7.不能在本库显式调用其他库;

8.默认情况下,azure sql database 不支持跨库操作,需要创建扩展表,建同构同名的表,只能是只读且架构唯一;

9.azure sql database 是基于v12的引擎,要在UI界面上操作建议安装ssms 2016版操作。

10.用户名限制,不能使用adminadministratorsaguestroot

using (FileStream fileReader = File.OpenRead(@"C:UsersAdministratorDesktop112.xls"))
        {
            //创建工作簿对象接收文件流(Excel信息)
            IWorkbook workbook = new HSSFWorkbook(fileReader);
            //工作簿共有几个表
            //int count = workbook.NumberOfSheets;
            //创建工作表读取工作簿表信息
            //ISheet sheet= workbook.GetSheet("表名称");
            ISheet sheet = workbook.GetSheetAt(0);
            string sql = @" insert into T_ExcelIn(Name,Remarks) values (@Name,@Remarks)";
            int ii = 0;
            //r = 1,剔除表头一行
            for (int r = 1; r <= sheet.LastRowNum; r )
            {
                //定义参数数组para
                SqlParameter[] para = new SqlParameter[] {
                    new SqlParameter("Name",SqlDbType.NVarChar,50),
                    new SqlParameter("Remarks",SqlDbType.NVarChar,50)
                };
                //创建一行获取sheet行数据
                IRow row = sheet.GetRow(r);
                //List<ICell> listcell = new List<ICell>();
                //int c = 1 即不读取自动编号的Id列
                for (int c = 1; c < row.LastCellNum; c )
                {
                    //将每行每个单元格的值添加带listcell集合中
                    //listcell.Add(row.GetCell(c));
                    //将每行的每个单元格的数据添加到para中 c-1即从0 开始记录参数
                    para[c-1].Value = row.GetCell(c).ToString();
                }
                //循环赋值给para
                //for (int i = 0; i < listcell.Count; i )
                //{
                //    para[i].Value = listcell[i].ToString();
                //}
                //执行添加Sql语句
                ii = SqlHelper.ExecuteNonQuery(sql, para);
            }
            if (ii > 0)
            {
                Response.Write("<script>alert('已将Excel数据插入到数据库表')</script>");
            }
            else
            {
                Response.Write("<script>alert('Excel数据插入到数据库表失败!')</script>");
            }

 

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));

        }

那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全部)Key点对应的Value,横向显示(也即以行的方式显示)

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

 

图片 21

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

 

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

本文由小鱼儿玄机30码发布于数据库,转载请注明出处:3.操作相比较,说有相当的大大概是jar包版本争辩

关键词: 小鱼儿玄机30码