C#处理MySQL数据库和SQL Server数据库的区别(存储过程的编写与调用、中文乱码、二进制图片存储与调用)

原创 2012年01月18日 14:23:46

最近忙着用利用webservice做一个信息查询、增加、删除、修改的应用程序。起初数据库用的是SQL server 2005,操作起来什么问题也没遇到过,一路都很顺畅。

但是转到MySQL数据库中时,却出现了很多问题。

最开始的问题是中文乱码,⊙﹏⊙b汗,最后会提到解决办法。因为习惯于sql server的那种无论是创建数据库还是创建表、存储过程等的T-SQL语句。

现在到mysql上面,多少有些不习惯。就拿最简单的创建id int型,自增长字段,一个identity(1,1),一个auto_incream;创建存储过程,参数写法也不一样。

具体如下所示(这里Sql server我们忽略大小写,以便与mysql进行对比,嘿嘿。这里演示的存储过程是向表parkinfo中插入数据。

至于为什么会用到存储过程,下面会提到。O(∩_∩)O哈哈~。

sql server 2005版:

create procedure parkinfo_insert
@parkid varchar(10),
@parkname varchar(80),
@parkaddr varchar(80),
@parkcorp varchar(40),
@parktype varchar(10),
@parkproperty varchar(10),
@parkmap LONGBLOB,
@searchkey text,
@plon varchar(15),
@plat varchar(15),
@updatetime DATETIME,
@capacity int(4),
@capacityfree int(4),
@pmanager varchar(10),
@objid varchar(8)
as

insert into parkinfo(parkid,parkname,parkaddr,parkcorp,parktype,parkproperty,parkmap,searchkey,plon,plat,updatetime,capacity,
capacityfree,pmanager,objid) 
values(@parkid,@parkname,@parkaddr,@parkcorp,@parktype,@parkproperty,@parkmap,@searchkey,@plon,@plat,@updatetime,@capacity,
@capacityfree,@pmanager,@objid)


mysql版

DELIMITER $

DROP PROCEDURE IF EXISTS `mytest`.`parkinfo_insert`$

CREATE PROCEDURE `parkinfo_insert`(
parkid varchar(10),
parkname varchar(80),
parkaddr varchar(80),
parkcorp varchar(40),
parktype varchar(10),
parkproperty varchar(10),
parkmap LONGBLOB,
searchkey text,
plon varchar(15),
plat varchar(15),
updatetime DATETIME,
capacity int(4),
capacityfree int(4),
pmanager varchar(10),
objid varchar(8)
)
BEGIN
		insert into parkinfo(parkid,parkname,parkaddr,parkcorp,parktype,parkproperty,parkmap,searchkey,plon,plat,updatetime,capacity,
capacityfree,pmanager,objid) values(parkid,parkname,parkaddr,parkcorp,parktype,parkproperty,parkmap,searchkey,plon,plat,updatetime,capacity,
capacityfree,pmanager,objid);
    END$

DELIMITER ;


------------------------------------------------------------------------------------------------------

以上用红色标注出来的是不一样的地方,相信大家也都看出来了。

下面我在C#编码中分别调用它们,看参数应该如何写。

sql server版:

        private void Build()
        {
            MySqlParameter[] parameters =
            {
                new MySqlParameter("@parkid",ParkInfo.ParkID),
                new MySqlParameter("@parkname",ParkInfo.ParkName),
                new MySqlParameter("@parkaddr",ParkInfo.ParkAddress),
                new MySqlParameter("@parkcorp",ParkInfo.ParkCorporation),
                new MySqlParameter("@parktype",ParkInfo.ParkType),
                new MySqlParameter("@parkproperty",ParkInfo.ParkProperty),
                new MySqlParameter("@parkmap",ParkInfo.ParkMap),
                new MySqlParameter("@searchkey",ParkInfo.SearchKey),
                new MySqlParameter("@plon",ParkInfo.ParkLon),
                new MySqlParameter("@plat",ParkInfo.ParkLat),
                new MySqlParameter("@updatetime",ParkInfo.UpdateTime),
                new MySqlParameter("@capacity",ParkInfo.Capacity),
                new MySqlParameter("@capacityfree",ParkInfo.CapacityFree),
                new MySqlParameter("@pmanager",ParkInfo.ParkManager),
                new MySqlParameter("@objid",ParkInfo.ObjID)               
            };
            Parameters = parameters;
        }

------------------------------------------------------------------------------------------------------------------

mysql版

        private void Build()
        {
            MySqlParameter[] parameters =
            {
                new MySqlParameter("?parkid",ParkInfo.ParkID),
                new MySqlParameter("?parkname",ParkInfo.ParkName),
                new MySqlParameter("?parkaddr",ParkInfo.ParkAddress),
                new MySqlParameter("?parkcorp",ParkInfo.ParkCorporation),
                new MySqlParameter("?parktype",ParkInfo.ParkType),
                new MySqlParameter("?parkproperty",ParkInfo.ParkProperty),
                new MySqlParameter("?parkmap",ParkInfo.ParkMap),
                new MySqlParameter("?searchkey",ParkInfo.SearchKey),
                new MySqlParameter("?plon",ParkInfo.ParkLon),
                new MySqlParameter("?plat",ParkInfo.ParkLat),
                new MySqlParameter("?updatetime",ParkInfo.UpdateTime),
                new MySqlParameter("?capacity",ParkInfo.Capacity),
                new MySqlParameter("?capacityfree",ParkInfo.CapacityFree),
                new MySqlParameter("?pmanager",ParkInfo.ParkManager),
                new MySqlParameter("?objid",ParkInfo.ObjID)               
            };
            Parameters = parameters;
        }

很明显,一个用?+字段名,一个用@+字段名。(还是sql server好,大爱啊。嘿嘿。)

 

现在来提一下为什么会用到存储过程。以下我试验过,至于还有没有其他办法,我就不清楚了,不知道是mysql的弊端还是什么。

我今年六月份刚毕业,工作算是整整一年了,个人能力有限,只是跟朋友们分享下个人的解决方案。

废话不多说,开始===

当我用直接insert,向mysql中插入数据时,如果有图片,转成二进制,存储进去,你会看到在改字段中(本例中是parkmap字段存储图片,sql server中image;mysql中longblod or blob(blob最大貌似就只能存储65kb的图片)),mysql中显示system.byte[],sql server中显示<二进制数据>,看起来没什么差别,可是当我查询的时候,mysql中却显示不出来,sql server显示正常。我显示图片用到的是.ashx文件,代码如下:

        private string strURL = ConfigurationManager.AppSettings["WebServiceURL"].ToString();
        public void ProcessRequest(HttpContext context)
        {
            MySolutionWebServices myservice = new MySolutionWebServices();
            myservice.Url = strURL;
            //ParkInfo parkinfo = new ParkInfo();
            int fid = int.Parse(context.Request.QueryString["ImageID"]);
            System.IO.Stream stream = null;

            context.Response.ContentType = "image/jpeg";
            context.Response.Cache.SetCacheability(HttpCacheability.Public);
            context.Response.BufferOutput = false;

            int buffersize = 1024 * 16;
            byte[] buffer = new byte[buffersize];

            stream = new MemoryStream((byte[])myservice.GetParkMapByID(fid));
            int count = stream.Read(buffer, 0, buffersize);

            while (count > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, count);
                count = stream.Read(buffer, 0, buffersize);
            }
        }

而通过存储过程存入mysql中,图片可在mysql中直接显示出来,我用的是sqlyog,通过。ashx文件,也成功显示出来了。

网上有人说:mysql以二进制存储图片时,只能用存储过程,这里,我不想表达什么,虽然我是用存储过程实现的,直接insert语句没实现,

但是,或许是因为我没找到更合适的方法。呵呵。这里提一下,用存储过程,一定能存入进去,insert就不得而知了。

 

另外,提下中文乱码问题,很多论坛里面都有提到,我这边也是借鉴别人的。

首先,安装mysql的时候,默认编码形式,选择utf8,安装时默认latin1,安装后,可通过mysql安装路径下的

C:\Program Files\MySQL\MySQL Server 5.0\bin目录中的MySQLInstanceConfig.exe进行设置。

方法百度一堆,这里不贴图了,主要是偶不会贴图,嘿嘿。

另外就是在客户端,我做的演示程序是B/S的,在每个页面中加入

 <meta http-equiv="content-type" content="text/html; charset=utf8" />

相信大家都明白是怎么一回事。

第一次写这么长的文章,希望对遇到同样问题的【鞥有有所帮助。

另外,希望各位大师们发表下不同的看法,O(∩_∩)O谢谢。

 

今天在对商品进行更新时,发现where条件中的参数一定不能用表中原有字段名称,不然相当于where 1=1

 

DELIMITER $$

DROP PROCEDURE IF EXISTS `zhwcdb`.`product_update`$$

CREATE PROCEDURE `product_update`(
productsid int,
productname         varchar(100),       
productimage        longblob,       
producttypeid       int(11),       
productprice        decimal(10,0),      
productdescription  varchar(100)
)
BEGIN
 update products set productname=productname,productimage=productimage,producttypeid=producttypeid,
productprice=productprice,productdescription=productdescription where productid=productsid;
    END$$

DELIMITER ;

 

注意红色字体部分。当然,参数定义?producstid

 

        private void Build()
        {
            MySqlParameter[] parameters =
            {
                new MySqlParameter("?productname",Products.ProductName),
                new MySqlParameter("?productimage",Products.ProductImage),
                new MySqlParameter("?producttypeid",Products.ProductTypyID),
                new MySqlParameter("?productprice",Products.ProductPrice),
                new MySqlParameter("?productdescription",Products.ProductDescription),
                new MySqlParameter("?productid",Products.ProductID)
            };
            Parameters = parameters;
        }


 

C#webservice调用oracle存储过程参数是中文时变成问号

问题:C#webservice调用oracle存储过程参数是中文时,存储过程获取的时间变成问号 解决:查看数据库字符集select userenv('language') from dual...
  • Pingy_de
  • Pingy_de
  • 2017年06月02日 16:12
  • 350

浅谈 sqlserver 和 mysql存储过程、函数的区别

公司之前用的是windows服务器,数据库也是sqlserver,现在说微软东西太贵了,要转向linux + mysql,但这之前先要测试一下性能,看怎么样的服务器才能满级要求,首先是数 据库服务器。...
  • zhang1990214
  • zhang1990214
  • 2015年05月26日 14:56
  • 725

SQL 之 存储过程、参数和函数

存储过程和参数 区别于之前的用单独一条语句检索数据,现在把多条语句保存到一个叫存储过程的单独对象中。   使用存储过程的原因: 1. 把多条SQL语句保存到单独的过程中 2. 把参数和SQL语句结合使...
  • ForestRound
  • ForestRound
  • 2016年10月06日 19:04
  • 1176

sql中存储过程和视图、函数的区别

视图:     视图由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式,同真实的数据表一样,视图也包含一系列带有名称的数据列和数据行,但视图与数据表又有很大的不同,视图中的...
  • u010313503
  • u010313503
  • 2015年03月13日 10:20
  • 2491

存储过程与函数的区别,函数可以嵌入sql语句from中使用,存储过程不行

存储过程与函数的区别 本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。    ...
  • nutian
  • nutian
  • 2008年04月21日 14:03
  • 3140

c#向SQL Server中存储图片并且再从数据库中读取图片

前言数据库课程设计答辩时,老师提出了如果数据是图片或者其他文件类型的时候,顿时觉得自己做的管理系统用到的较多的就是Char类型。于是,答辩结束后,就搜集资料学习,在查找资料的时候发现,有的一开始并不能...
  • sinat_27714067
  • sinat_27714067
  • 2016年07月01日 17:08
  • 5098

Sql Sereve存储过程及调用过程(详解)

一、创建数据表 下图为表 custom 结构 下图为表 department 结构(id为外键,作为表custom中列 departID的参考列) 二、创建增删查改的存储过程(详细说明) (...
  • Ape_Programmer
  • Ape_Programmer
  • 2017年04月15日 13:34
  • 407

C#与SQL Server存储过程之一(创建):使用C#创建SQL Server的存储过程

 通常,开发人员使用的是T-SQL来创建SQL Server的存储过程、函数和触发器。 而现在的SQL Server 2005已经完全支持.NET通用语言运行时(CLR)了。 这就意味着,你可以使用....
  • hillspring
  • hillspring
  • 2008年04月18日 16:29
  • 7249

SQL Server 调用C#.net写的Dll ,(分享我的HelloWorld测验)

SQL Server 调用 C#.net 写的Dll 1、构造DLL:首先我们要在。net里面创建一个类库工程,写个简单的HelloWorldusing System;namespace MyDll{...
  • iamup
  • iamup
  • 2006年02月17日 10:17
  • 504

Sql server 跨服务器在一个存储过程sp_A中调用另一个存储过程sp_B

declare @b intdeclare @sqlstr varchar(500)set @b=1539set @sqlstr=SELECT a.* FROM OPENROWSET       +(...
  • wvivw
  • wvivw
  • 2005年08月23日 15:50
  • 1238
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#处理MySQL数据库和SQL Server数据库的区别(存储过程的编写与调用、中文乱码、二进制图片存储与调用)
举报原因:
原因补充:

(最多只允许输入30个字)