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

posted @ 2012-09-26 10:29  梨花驿路  阅读(559)  评论(0编辑  收藏  举报