现在的位置: 首页 > 综合 > 正文

C#开发用sql server(2008)与mysql(5.6) 的不同之处

2013年10月06日 ⁄ 综合 ⁄ 共 6778字 ⁄ 字号 评论关闭

C#开发用sql server(2008)与mysql(5.6) 的不同之处

程序方面

1 连接字符串

Sql server: connectionString="DataSource=IP;Initial Catalog=DBname;Persist Security Info=True;UserID=sa;Password=pwd;Max Pool Size = 512"

Mysql:connectionString="Server=127.0.0.1;Database=dbname;Uid=root;Pwd=pwd;charset=utf8;"

2 数据操作类库

Sql server: using System.Data.SqlClient;

Mysql: using MySql.Data.MySqlClient;(要下载mysql.data.dll)

3 调用存储过程区别(调用方式相同,有些小区别)

Sql server: 传参时参数名一般以@开头

Mysql: 参数不能以@开头,以?开头,存储过程的不用?开头,定义的参数名与存储过程一致即可,但不要与字段名相同

 

数据库部分

1 top 与limit

Sql server: select top n * from table orderby id desc;

Mysql: select * from table order by id desclimit n;

 

2 group by

Sql server: select itemcode,Avg(itemvalue)from table group by itemcode

Group by 部分须与select 部分一致,除非统计类用到的字段

Mysql: select itemcode,Avg(itemvalue) fromtable group by itemcode

 

3 日期函数很多不同,列出常用的一个

Sql server:convert(varchar(10),getdate(),120)  将时间转换成年-月-日 格式字符串

Mysql: DATE_FORMAT(NOW(),'%Y-%m-%d') mysql还有其它方式可以实现此功能

 

4 字符串相加

SqlServer 直接用 +  如 str1 + str2

MySql concat() 如 set str3 =concat(str1,str2);

 

5 存储过程写法

Sqlserver:

1 多个语句之间可以用;分隔,也可不用

2执行动态sql

Declare @strsql varchar(2000)

Set @strsql=’select * from table where id=@参数id’

Execute(@strsql);

3 Print @strsql                  打印(显示)出执行的sql语句

4 exec(其它存储过程 参数1)

Mysql:

1多个语句之间必须用;分隔,查询里也一样

2 执行动态sql

Declare strSQL varchar(2000);

Set @strSQL2=concat(’select * from tablewhere id=’,’参数id’);

prepare strSQL from @strSQL2;

execute strSQL;

3 SELECT @strSQL2; 打印(显示)出执行的sql语句

4 call 其它存储过程(参数1)

 

6. isnull()

SqlServer isnull()

MySql ifnull()

 

7. getdate()

SqlServer getdate()

MySql now()

 

8. newid()

SqlServer newid()

MySql uuid()

 

9. @@ROWCOUNT

SqlServer @@ROWCOUNT

MySql row_count()

注意:MySql的这个函数仅对于update, insert, delete有效 

 

10. SCOPE_IDENTITY()

SqlServer SCOPE_IDENTITY()

MySql last_insert_id()

 

11. if ... else ...

SqlServer IF Boolean_expression

     Begin

sql_statement | statement_block

          end

 ELSE

    Begin

sql_statement | statement_block

end

-- 单条语句可以不要BEGIN 和 END。

MySql

 IFsearch_condition THEN statement_list

   [ELSEIF search_condition THEN statement_list] ...

   [ELSE statement_list]

END IF

注意:对于MySql来说,then, end if是必须的。类似的还有其它的流程控制语句,这里就不一一列出。

 

12. declare

其实,SqlServer和MySql都有这个语句,用于定义变量,但差别在于:在MySql中,DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。这个要求在写游标时,会感觉很BT.

 

13 游标的写法

 

SqlServer

declare @tempShoppingCart table (ProductIdint, Quantity int)

insert into @tempShoppingCart (ProductId,Quantity)

         selectProductId, Quantity from ShoppingCart where UserGuid = @UserGuid

declare @productId int

declare @quantity int

declare tempCartCursor cursor for

                   selectProductId, Quantity from @tempShoppingCart

open tempCartCursor

fetch next from tempCartCursor into@productId, @quantity

while @@FETCH_STATUS = 0

begin

         updateProduct set SellCount = SellCount + @quantity  whereproductId = @productId

 

         fetchnext from tempCartCursor into @productId, @quantity

end

 

close tempCartCursor

deallocate tempCartCursor

 

MySql

declare m_done int default 0;

declare m_sectionId int;

declare m_newsId int;

 

declare _cursor_SN cursor for selectsectionid, newsid from _temp_SN;

declare continue handler for not found setm_done = 1;

 

create temporary table _temp_SN

         selectsectionid, newsid from SectionNews  groupby sectionid, newsid having count(*) > 1;

 

open _cursor_SN;

while( m_done = 0 ) do

         fetch_cursor_SN into m_sectionId, m_newsId;

        

         if(m_done = 0 ) then

                   --具体的处理逻辑

         endif;

end while;

close _cursor_SN;

drop table _temp_SN;

注意:为了提高性能,通常在表变量上打开游标,不要直接在数据表上打开游标。

 

14. 分页的处理

 

SqlServer create procedure GetProductByCategoryId(

   @CategoryID int,

   @PageIndex int = 0,

   @PageSize int = 20,

   @TotalRecords int output

)

as

begin

    

declare @ResultTable table

(

   RowIndex int,

   ProductID int,

   ProductName nvarchar(50),

   CategoryID int,

   Unit nvarchar(10),

   UnitPrice money,

   Quantity int

);

    

insert into @ResultTable

select row_number() over (order byProductID asc) as RowIndex,

      p.ProductID, p.ProductName, p.CategoryID, p.Unit, p.UnitPrice,p.Quantity

from  Products as p

where CategoryID = @CategoryID;

      

select @TotalRecords = count(*) from @ResultTable;

    

select *

from  @ResultTable

where RowIndex > (@PageSize * @PageIndex) and RowIndex <= (@PageSize *(@PageIndex+1));

    

end;

当然,SqlServer中并不只有这一种写法,只是这种写法是比较常见而已。

 

MySql create procedureGetProductsByCategoryId(

   in_categoryId int,

   in_pageIndex int,

   in_pageSize int,

  out _totalRecCount int

)

begin

 

  set @categoryId = _categoryId;

  set @startRow = _pageIndex * _pageSize;

  set @pageSize = _pageSize;

 

  prepare PageSql from

         'selectsql_calc_found_rows * from product  wherecategoryId = ? order by ProductId desc limit ?, ?';

  execute PageSql using @categoryId, @startRow, @pageSize;

  deallocate prepare PageSql;

  set _totalRecCount = found_rows();

 

end

 

15 变量的定义及用法

sql server中变量要先申明后赋值:

局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);

申明局部变量语法:declare @变量名数据类型;

例如:declare @num int;

赋值:有两种方法式(@num为变量名,value为值)

set @num=value;   或   select @num=value;

如果想获取查询语句中的一个字段值可以用select给变量赋值,如下:

select @num=字段名 from 表名 where ……

 

mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。

第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量

第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……

注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”

第三种用法用declare 声明变量,declare 语句必须放在所有语句的最上面,可以用set 赋值,也可以 select filedname from table into 声明的变量名 (此方式也适用于@变量;

 

16 临时表用法

Sql server:

         --下面列的是变量表

declare
@curdayData
table

    (ID
int,

    ItemCode
int
,

    ItemValue
decimal
,

    IsDeal char(1))

Insert into
@curdayData
select
ID
,ItemCode,ItemValue,'0'
as IsDeal
From
BaseEMData where
IsFilter='0'
and DataFlag='0'
and DATEDIFF(day,samplingtime,getdate())=3
order by
ID
desc

 

Mysql:

#创建前如果表存在则先删除

DROP TABLE IF EXISTS tmp_table;

CREATE TEMPORARY TABLE tmp_table(ItemcodeINT,Itemvalue FLOAT,Isdeal char(1));

         INSERTINTO tmp_table(Itemcode,Itemvalue,Isdeal) select ItemCode,max(ItemValue),'0'from SiteBaseEMData group by itemcode;

 select * from tmp_table;

         select@num:=count(1) from tmp_table;

         while(@num>0)DO

         set@num:=@num-1;

         select@peritemcode:=itemcode from tmp_table where isdeal='0';

         updatetmp_table set Isdeal='1' where itemcode =@peritemcode;

         SELECT@peritemcode;

 

end WHILE;

         select* from tmp_table;

         dropTEMPORARY table tmp_table;

 

mysql临时表的限制:

临时表只能用在memory,myisam,merge,或者innodb

临时表不支持mysqlcluster(簇)

在同一个query语句中,你只能查找一次临时表。例如:下面的就不可用

mysql> SELECT * FROM temp_table, temp_table AS t2;

ERROR 1137: Can't reopen table: 'temp_table'

 

如果在一个存储函数里,你用不同的别名查找一个临时表多次,或者在这个存储函数里用不同的语句查找,这个错误都会发生。

 

show tables 语句不会列举临时表

你不能用rename来重命名一个临时表。但是,你可以alter table代替:

mysql>ALTER TABLE orig_name RENAME new_name;

临时表用完后要记得drop掉:

DROP TEMPORARY TABLE IF EXISTSsp_output_tmp;

 

17 备份数据库

Sqlserver:

         BACKUP DATABASE
@databasename  TO
DISK =
@strPath
WITH NOINIT
, NOUNLOAD
,
NOSKIP ,
STATS = 10,
NOFORMAT

@databasename  数据库名

@strPath 备份的路径

Mysql:

string strsql =
@"/c mysqldump-h192.168.1.1 -P3306 -uroot -proot --default-character-set=utf8 ISDB >E:\DBBack\" +
DateTime.Now.ToString().Replace("-",
"").Replace(":",
"").Replace("//",
"").Replace("/",
"").Replace("\\","").Replace(" ",
"")+ ".sql";

               
Process
.Start("cmd.exe",strsql);

上例-uroot –u,root为用户名,后面类同,调用方式为c#

 

还原mysql
-
hlocalhost -P3306
-uroot
-
p123 mydata 
< d:\back\mydata.sql

 

18标示符限定符

 

SqlServer

[ ]

MySql

``

 

 

mysql注意事项:

1 如果要支持中文字符,在安装数据库的时候选用utf-8字符集;或在数据库表属性中更改

 

由于本人也是刚接触mysql方面的开发,很多用法并不一定对或者是最好的,请各位看到不妥的敬请指出,不胜感激

抱歉!评论已关闭.