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;
        }


 

相关文章推荐

VB保存图片文件到数据库

VERSION 5.00 Object = "{67397AA1-7FB1-11D0-B148-00A0C922E820}#6.0#0"; "MSADODC.OCX" Object = "{F9043...

mongodb存储图片和文件实践

可能很多人会问为何要用mongodb存储图片和文件,我的理由是mongodb作存储方便稳定易扩展,我们自己写的文件存储服务器肯定很LOW,除了含有巨量图片的大型系统,一般由公司自研图片存储外,大部分情...

ASP中调用存储过程、语法、写法-sql server数据库,return,output

ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用,这些资...
  • cncco
  • cncco
  • 2015年11月17日 13:44
  • 394

MFC操作SQL server数据库之存储过程的调用

存储过程的返回值可分为三种情况:无返回值,参数返回以及return返回,下面我会对三种存储过程的调用分别说明。 数据库中已经有了以下三个存储过程: 1.InsertLine  //插入一条数据,且...

C#中连接SQL Server数据库、执行存储过程

using System.Data.SqlClient; using System.Configuration; private void button2_Click(object sender, ...

C#调用SQL Server存储过程

-- 建表 CREATE TABLE sale_report (      sale_date DATETIME NOT NULL ,      sale_item VARCHAR(2) NOT...

C#调用SQL SERVER存储过程

1. 只返回单一记录集的存储过程 1.1 存储过程Categoriestest1   CREATE PROCEDURE Categoriestest1      AS      select ...

SQL Server中存储过程Stored Procedure创建及C#调用

存储过程就是已经编译好的、优化过的放在数据库服务器中的一些SQL语句;可供应用程序直接调用。使用存储过程有以下几个优点: 1、执行速度比普通的SQL语句快 2、便于集中控制 3、可以降低网络的通...

C#调用SQL Server存储过程简单实例

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#处理MySQL数据库和SQL Server数据库的区别(存储过程的编写与调用、中文乱码、二进制图片存储与调用)
举报原因:
原因补充:

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