zoukankan      html  css  js  c++  java
  • asp.net开发mysql注意事项

    一:mysql数据库的 表的创建,主键,外键的设置

    1:安装的时候选择 utf-8 字符

    2:创建数据库的时候 选择默认

    3:创建表  引擎 字符 都选择默认

    MySQL中利用外键实现级联删除、更新
    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在 创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。
    因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。

    我所使用的版本是Mysql5.1版本的  mysql-5.1.51-win32.msi                                                 使用的mysql图形界面是 SQLyog-10.0.0-0.zip

    image

    但是保存之后,点击修改一定要确定是这样的

    image

    接下来是外键,创建一个新闻回复表,其中新闻回复表的newsid 这个外键引用的是  新闻表的 newsid

    image

    设置回复表的newsid外键,引用的是news表的 newsid主键,并且做了一个  级联删除,当news表的 newsid删除的时候,外检表 新闻回复表也会跟着删除

    image

    二:如果是 .net 2.0 环境,则无法使用微软企业库 5.0 版本,(微软企业库5.0版本 支持 .net 3.5 和 4.0 ,不支持 2.0)

    三:asp.net 调用 mysql的方法   asp.net中使用MYSQL参数化的方法  需要将 sql中的 @ 换成 ?

    MySqlConnection conn = new MySqlConnection(connStr);
                conn.Open();
                MySqlCommand cmd = new MySqlCommand("select count(1) from qyexam_notice where title=?title",conn);
                cmd.Parameters.Add(new MySqlParameter("?title", "《测试试卷》2011/12/14 10:47:00开始"));
                object obj = cmd.ExecuteScalar();
                conn.Close();
                Response.Write("结果:"+obj);
    

    四:mysql存储过程特殊的规范

    DELIMITER $$
    
    CREATE   PROCEDURE `aaa`(p_id VARCHAR(64))
    BEGIN
    	SELECT * FROM news WHERE newsid=p_id LIMIT 1;
    END$$
    
    DELIMITER ;
     
    注意要写 DELIMITER $$  开头和  DELIMITER ;结尾,begin和end之间的语句记得写 ; 结尾, 然后存储过程的名字和特殊的字符不是 []而是左上角tab键上的`
     

    五:调用存储过程的时候,参数的顺序必须要和存储过程里面的参数顺序一模一样,如何调用存储过程

     
    CREATE PROCEDURE tb_ad_hitrecord_GetCount(p_starttime DATETIME,p_endtime DATETIME,p_AdId INT)
    BEGIN
    	SELECT  COUNT(1) FROM tb_ad_hitrecord  WHERE  (`HitDate` BETWEEN p_starttime AND p_endtime)  AND AdId=p_AdId;
    END$$
    DELIMITER ;
     
    在mysql的查询分析器调用的时候 :如何调用存储过程呢?用 CALL 关键字,时间用 逗号 而不是 # 号
    CALL `tb_ad_hitrecord_GetCount`('2012-07-04 15:16:25','2012-07-07 09:11:36',1)
     
     
     
    CALL `tb_ad_hitrecord_ADD`(1,'#2012-07-05#')

    同样的,在asp.net的代码中调用存储过程的时候,写参数也一定要按照mysql的存储过程的参数来写,顺序不能像sql那样乱调。

    六:获取刚插入的数据的id,使用select max(id) from table ? mysql也提供了一个类似于 sqlserver一样的 @@identity 这样的函数 叫做

    LAST_INSERT_ID()

    一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。

    DELIMITER $$
    
    USE `edt_date`$$
    
    DROP PROCEDURE IF EXISTS `tb_ad_hitrecord_ADD`$$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `tb_ad_hitrecord_ADD`(p_AdId INT,p_HitDate DATETIME)
    BEGIN
    	INSERT INTO tb_ad_hitrecord(AdId,HitDate)VALUES(p_AdId,p_HitDate);
    	-- select max(HitId) from tb_ad_hitrecord;
    	SELECT LAST_INSERT_ID();
    END$$
    
    DELIMITER ;

    注意事项

    (1)、查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的。

    mysql> SELECT LAST_INSERT_ID();

            -> 100

    使用这函数向一个给定Connection对象返回的值是该Connection对象产生对影响AUTO_INCREMENT列的最新语句第一个AUTO_INCREMENT值的。这个值不能被其它Connection对象的影响,即它们产生它们自己的AUTO_INCREMENT值。

    (2)、LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID返回表b中的Id值。

    (3)、 假如你使用一条INSERT语句插入多个行,  LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。其原因是这使依靠其它服务器复制同样的 INSERT语句变得简单。

    mysql> INSERT INTO t VALUES

        -> (NULL, ‘Mary’), (NULL, ‘Jane’), (NULL, ‘Lisa’);

    mysql> SELECT * FROM t;

    | id | name |

    +—-+——+

    |  1 | Bob  |

    |  2 | Mary |

    |  3 | Jane |

    |  4 | Lisa |

    mysql> SELECT LAST_INSERT_ID();  //这就是我要说明的关键问题。

    | LAST_INSERT_ID() |

    |                2 |

    虽然将3 个新行插入 t, 对这些行的第一行产生的 ID 为 2, 这也是 LAST_INSERT_ID()返回的值。

    (4)、假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT (自动增长列的)计数器不会增量,而 LAST_INSERT_ID() 返回0, 这反映出没有插入任何记录。

    七:mysql如何插入带时间的sql语句,不是用 #号,而是用 逗号 即可

    insert into news(id,time) values(1,'2012-07-04 15:16:25')

  • 相关阅读:
    吉他 摄影
    前端思考独处时间自我成长
    约束力
    js算法
    旅行计划
    生产者消费者问题
    Lock锁
    线程和进程
    什么是JUC
    GC日志分析和垃圾回收器的新展望
  • 原文地址:https://www.cnblogs.com/joeylee/p/2703517.html
Copyright © 2011-2022 走看看