您的位置:首页 > 编程语言 > ASP

asp.net开发mysql注意事项

2012-09-26 10:29 417 查看

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

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

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

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

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

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





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





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





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





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

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

MySqlConnectionconn=newMySqlConnection(connStr);
conn.Open();
MySqlCommandcmd=newMySqlCommand("selectcount(1)fromqyexam_noticewheretitle=?title",conn);
cmd.Parameters.Add(newMySqlParameter("?title","《测试试卷》2011/12/1410:47:00开始"));
objectobj=cmd.ExecuteScalar();
conn.Close();
Response.Write("结果:"+obj);


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

DELIMITER$$

CREATEPROCEDURE`aaa`(p_idVARCHAR(64))
BEGIN
SELECT*FROMnewsWHEREnewsid=p_idLIMIT1;
END$$

DELIMITER;
注意要写DELIMITER$$开头和DELIMITER;结尾,begin和end之间的语句记得写;结尾,然后存储过程的名字和特殊的字符不是[]而是左上角tab键上的`

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

CREATEPROCEDUREtb_ad_hitrecord_GetCount(p_starttimeDATETIME,p_endtimeDATETIME,p_AdIdINT)
BEGIN
SELECTCOUNT(1)FROMtb_ad_hitrecordWHERE(`HitDate`BETWEENp_starttimeANDp_endtime)ANDAdId=p_AdId;
END$$
DELIMITER;
在mysql的查询分析器调用的时候:如何调用存储过程呢?用CALL关键字,时间用逗号而不是#号
CALL`tb_ad_hitrecord_GetCount`('2012-07-0415:16:25','2012-07-0709:11:36',1)
CALL`tb_ad_hitrecord_ADD`(1,'#2012-07-05#')

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

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

LAST_INSERT_ID()

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

DELIMITER$$

USE`edt_date`$$

DROPPROCEDUREIFEXISTS`tb_ad_hitrecord_ADD`$$

CREATEDEFINER=`root`@`localhost`PROCEDURE`tb_ad_hitrecord_ADD`(p_AdIdINT,p_HitDateDATETIME)
BEGIN
INSERTINTOtb_ad_hitrecord(AdId,HitDate)VALUES(p_AdId,p_HitDate);
--selectmax(HitId)fromtb_ad_hitrecord;
SELECTLAST_INSERT_ID();
END$$

DELIMITER;

注意事项
(1)、查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的。
mysql>SELECTLAST_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>INSERTINTOtVALUES
->(NULL,‘Mary’),(NULL,‘Jane’),(NULL,‘Lisa’);
mysql>SELECT*FROMt;
|id|name|
+—-+——+
|1|Bob|
|2|Mary|
|3|Jane|
|4|Lisa|
mysql>SELECTLAST_INSERT_ID();  //这就是我要说明的关键问题。
|LAST_INSERT_ID()|
|2|
虽然将3个新行插入t,对这些行的第一行产生的ID为2,这也是LAST_INSERT_ID()返回的值。
(4)、假如你使用INSERTIGNORE而记录被忽略,则AUTO_INCREMENT(自动增长列的)计数器不会增量,而LAST_INSERT_ID()返回0,这反映出没有插入任何记录。

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

insertintonews(id,time)values(1,'2012-07-0415:16:25')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航