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

时间:2022-11-02 21:48:41

最近忙着用利用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;
        }