您的位置:首页 > 移动开发

Microsoft Application Blocks for .NET学习笔记

2005-12-23 17:27 603 查看
不管怎么说Microsoft Application Blocks for .NET是一个好东东,至少对我这种使用数据库经验很少的人来说,不得不说是一个福音,对数据库只要专注一下存储过程就行了.同时为.net开发做了一个好样式,尽管微软说这不是标准.

首先,可以从它的图开始



显然对于象我这样只能设计点单位小的数据库系统的人来说,条件有限,(一般只用access)sql数据库使用很少(只是自已机子上有个桌面版),连存储过程都用得很少,所以用大量的时间去写数据库操作语言,还要结合到程序中,而且常常重复工作,真是不爽,,这个东东很好.

它提供了5个方法,ExecuteNonQueryExecuteDatasetExecuteReaderExecuteScalarExecuteXmlReader。而且都是static 类的,这让人想起form程序中的程序入口也是static的,也就是说这只能有一个实例在内存中(或者说不用生成实例的,可直接可以使用的).

问题:对于不同的程序和web程序是不是在内存中也只有一个实例呢?(要实验一下,特别一个form程序时,另一个是web程序时,是不是只有一个呢? 当然前提是要将application blocks 生成DLL文件,然后进行引用.

我现在直接将application blocks引用到项目中,不知生成web程序后,和引用DLL是不是一样呢?

(1月10日,必须引用才能使用,把application blocks for .net原程序引入项目中后,进行编译就生成了microsoft applicationBlocks data.dll.然后在自已的程序中引用一下,就行,

通过 using Microsoft.ApplicationBlocks.Data就行了;其实原程序只是给你看一看调用的对象而已.)

对于这五个方法,每个方法都利用重载方式进行定义,方便了大家的使用,重载的方法都是如下形式:

[C#]
Execute* (SqlConnection connection, CommandType commandType,
string commandText)

Execute* (SqlConnection connection, CommandType commandType,
string commandText, params SqlParameter[] commandParameters)

Execute* (SqlConnection connection, string spName,
params object[] parameterValues)

Execute* (SqlConnection connection,
CommandType commandType, string commandText)

Execute* (SqlConnection connection,
CommandType commandType, string commandText,
params SqlParameter[] commandParameters)

Execute* (SqlConnection connection,
string spName, params object[] parameterValues)

除此之外,还定义了以下重载函数(除ExectuteXmlReader之外)

[C#]
Execute* (string connectionString, CommandType commandType,
string commandText)

Execute* (string connectionString, CommandType commandType,
string commandText,
params SqlParameter[] commandParameters)

Execute* (string connectionString, string spName,
params object[] parameterValues)
主要是直接提供了连接串,不用再用对象,这种方式提高了效率..

ExecuteNonQuery主要是用于查询,返回是影响的行数.可以利用存储过程中的参数传递.来得到想要的值.

每个方法要注意返回的类型:

如果要dataset 请用ExecuteDataset

eg;

一个存储过程:ALTER PROCEDURE dbo.GetExpertData
AS
SET NOCOUNT ON;
SELECT ID, NAME AS 姓名, SEX AS 性别, ZHICHEN AS 职称, ZHIWU AS 职务, LANGU1 AS 外语, LAGU_LEVEL1 AS 外语水平, GRAMMER AS 学位, KN_LEVEL AS 水平, EXPER AS 专业, EXPER_NOW AS 现从事专业, EXPERT AS 专长 FROM EXPERT
return 0


程序中调用方式:

private void BindGrid()
{
//DataGrid1.DataSource = CreateDataSource();

DataSet dsData = new DataSet();
dsData = SqlHelper.ExecuteDataset(sqlConnection1.ConnectionString, CommandType.StoredProcedure, "GetExpertData");
DataGrid1.DataSource=dsData;
DataGrid1.DataMember="Table";
DataGrid1.DataBind();
//ShowStats();


显然,直接对SqlHelper.ExecuteDataset进行了直接调用,返回到一个新定义的dataset中,其实就是一个指向dataset的对象.然后对datagrid1的dataSource和dataMember进行付值后,就行了,奇怪的是在dataset中生成的表竟名为"Table";要是在一个dataset中多生成几个表,又该怎么做呢?

如果返回某个记录,可用ExcuteReader

一个错误让人思考:

源错误:

[code]行 507:
行 508:			//fill the DataSet using default values for DataTable names, etc.
行 509:			da.Fill(ds);
行 510:
行 511:			// detach the SqlParameters from the command object, so they can be used again.

为什么在microsoft applicationBlocks.Data.dll中还会有//fill....这样的内容,这个IL连说明也在里面吗?

显然,这个dll.唯一和我们asp.net webform就是在名字空间后定义的类了.

一个是public class WebForm1 : System.Web.UI.Page

另一个就是public sealed class SqlHelper它们都是由项目出现的.当然,微软在后面做了很多的.

[/code]
好了这么久有开始加一点吧,2月6日又开始做一点.现在将利用这个dll来对数据库记录进行修改、插入

先看存储过程吧,修改过程ExpertUpdata

ALTER PROCEDURE dbo.ExpertUpdata

(

@EXPERTId int ,
@NAME nvarchar(50),
@SEX SmallInt,
@ZHICHEN nvarchar(50),
@ZHIWU nvarchar(50),
@LANGU1 nvarchar(50),
@LAGU_LEVEL1 nvarchar(50),
@GRAMMER nvarchar(50),
@KN_LEVEL nvarchar(50),
@EXPER nvarchar(50),
@EXPER_NOW nvarchar(50),
@EXPERT ntext,
@BIRTHDAY datetime,
@CONTRY nvarchar(50),
@DEPART nvarchar(50),
@EMAIL nvarchar(50),
@HAND_CALL nvarchar(50),
@HOEM_ADRESS nvarchar(50),
@HOEM_ZIP nvarchar(50),
@HOME_CALL nvarchar(50),
@IDENTI nvarchar(15),
@LANGU_LEVEL2 nvarchar(50) ,
@LANGU2 nvarchar(50),
@PLACE nvarchar(50),
@PLACE_ADRESS nvarchar(50),
@PLACE_CLASS SmallInt,
@PLACE_PHONE1 nvarchar(50),
@PLACE_PHONE2 nvarchar(50),
@PLACE_ZIP nvarchar(50),
@SMHAND_CALL nvarchar(50),
@TELE nvarchar(50)

)

AS
/* SET NOCOUNT ON */
UPDATE EXPERT
SET NAME = @NAME, SEX = @SEX, BIRTHDAY = @BIRTHDAY,
HOME_CALL = @HOME_CALL, SMHAND_CALL = @SMHAND_CALL,
HAND_CALL = @HAND_CALL, EMAIL = @EMAIL, IDENTI = @IDENTI,
HOEM_ADRESS = @HOEM_ADRESS, HOEM_ZIP = @HOEM_ZIP, PLACE = @PLACE,
PLACE_CLASS = @PLACE_CLASS, PLACE_ADRESS = @PLACE_ADRESS,
PLACE_ZIP = @PLACE_ZIP, DEPART = @DEPART, ZHIWU = @ZHIWU,
ZHICHEN = @ZHICHEN, PLACE_PHONE1 = @PLACE_PHONE1,
PLACE_PHONE2 = @PLACE_PHONE2, TELE = @TELE, KN_LEVEL = @KN_LEVEL,
GRAMMER = @GRAMMER, CONTRY = @CONTRY, LANGU1 = @LANGU1,
LAGU_LEVEL1 = @LAGU_LEVEL1, LANGU2 = @LANGU2,
LANGU_LEVEL2 = @LANGU_LEVEL2, EXPER = @EXPER,
EXPER_NOW = @EXPER_NOW, EXPERT = @EXPERT
WHERE (ID = @EXPERTID)

RETURN

调用过程

SqlParameter[] sqlPara=new SqlParameter[31];//主要是定义一个参数的数组注意必须定义维数,否则要产生参数未定义的错误。
sqlPara[0] = new SqlParameter("@EXPERTId", SqlDbType.Int );
sqlPara[0].Value=Int16.Parse(Request.Params["Id_value"]);

sqlPara[1] = new SqlParameter("@NAME", SqlDbType.NVarChar,50 );
sqlPara[1].Value= NameBox.Text;

sqlPara[2] = new SqlParameter("@SEX", SqlDbType.Int );
sqlPara[2].Value= SexList.SelectedIndex;

sqlPara[3] = new SqlParameter("@ZHICHEN", SqlDbType.NVarChar,50 );
sqlPara[3].Value= ZhichenBox.Text;

sqlPara[4] = new SqlParameter("@ZHIWU", SqlDbType.NVarChar,50 );
sqlPara[4].Value= ZhiwuBox.Text;

sqlPara[5] = new SqlParameter("@LANGU1", SqlDbType.NVarChar,50 );
sqlPara[5].Value= Lang1.Text;

sqlPara[6] = new SqlParameter("@LAGU_LEVEL1", SqlDbType.NVarChar,50 );
sqlPara[6].Value = LangLevel1.Text;

sqlPara[7] = new SqlParameter("@GRAMMER", SqlDbType.NVarChar,50 );
sqlPara[7].Value= GramBox.Text;

sqlPara[8] = new SqlParameter("@KN_LEVEL", SqlDbType.NVarChar,50 );
sqlPara[8].Value= LevelBox.Text;

sqlPara[9] = new SqlParameter("@EXPER", SqlDbType.NVarChar,50 );
sqlPara[9].Value= ExperBox.Text;

sqlPara[10] = new SqlParameter("@EXPER_NOW", SqlDbType.NVarChar,50 );
sqlPara[10].Value= AreaBox.Text;

sqlPara[11] = new SqlParameter("@EXPERT", SqlDbType.NText );
sqlPara[11].Value = ExpecalBox.Text;

sqlPara[12] = new SqlParameter("@BIRTHDAY", SqlDbType.SmallDateTime );
sqlPara[12].Value = BirthBox.Text;

sqlPara[13] = new SqlParameter("@CONTRY", SqlDbType.NVarChar,50 );
sqlPara[13].Value= CountryBox.Text ;

sqlPara[14] = new SqlParameter("@DEPART", SqlDbType.NVarChar,50 );
sqlPara[14].Value= DepartBox.Text;

sqlPara[15] = new SqlParameter("@EMAIL", SqlDbType.NVarChar ,50);
sqlPara[15].Value= EmailBox.Text;

sqlPara[16] = new SqlParameter("@HAND_CALL", SqlDbType.NVarChar,50 );
sqlPara[16].Value= Handcall.Text;

sqlPara[17] = new SqlParameter("@HOEM_ADRESS", SqlDbType.NVarChar,50 );
sqlPara[17].Value= AddressBox.Text;

sqlPara[18] = new SqlParameter("@HOEM_ZIP", SqlDbType.NVarChar,50 );
sqlPara[18].Value= HomezipBox.Text;

sqlPara[19] = new SqlParameter("@HOME_CALL", SqlDbType.NVarChar,50 );
sqlPara[19].Value= Homecall.Text;

sqlPara[20] = new SqlParameter("@IDENTI", SqlDbType.NVarChar,15 );
sqlPara[20].Value= IdentBox.Text;

sqlPara[21] = new SqlParameter("@LANGU_LEVEL2", SqlDbType.NVarChar ,50);
sqlPara[21].Value= LangLevel2.Text;

sqlPara[22] = new SqlParameter("@LANGU2", SqlDbType.NVarChar ,50);
sqlPara[22].Value= Lang2.Text;

sqlPara[23] = new SqlParameter("@PLACE", SqlDbType.NVarChar ,50);
sqlPara[23].Value= CopBox.Text;

sqlPara[24] = new SqlParameter("@PLACE_ADRESS", SqlDbType.NVarChar ,50);
sqlPara[24].Value= CopaddressBox.Text;

sqlPara[25] = new SqlParameter("@PLACE_CLASS", SqlDbType.SmallInt );
sqlPara[25].Value= PlaceList.SelectedIndex;

sqlPara[26] = new SqlParameter("@PLACE_PHONE1", SqlDbType.NVarChar,50 );
sqlPara[26].Value= PlacecallBox1.Text;

sqlPara[27] = new SqlParameter("@PLACE_PHONE2", SqlDbType.NVarChar,50 );
sqlPara[27].Value = PlacecallBox2.Text;

sqlPara[28] = new SqlParameter("@PLACE_ZIP", SqlDbType.NVarChar ,50);
sqlPara[28].Value = PlacezipBox.Text;

sqlPara[29] = new SqlParameter("@SMHAND_CALL", SqlDbType.NVarChar,50 );
sqlPara[29].Value= Smallcall.Text;

sqlPara[30] = new SqlParameter("@TELE", SqlDbType.NVarChar ,50);
sqlPara[30].Value= FaxBox.Text;

SqlHelper.ExecuteNonQuery(sqlConnection1.ConnectionString,CommandType.StoredProcedure, "ExpertUpdata", sqlPara);

以上没什么好说的,只是没有进行错误处理,注意应该用try

现在是关于插入的过程InsetExpert

ALTER PROCEDURE dbo.InsetExpert

(

@ExpertId int OUTPUT,
@NAME nvarchar(50),
@SEX SmallInt,
@ZHICHEN nvarchar(50),
@ZHIWU nvarchar(50),
@LANGU1 nvarchar(50),
@LAGU_LEVEL1 nvarchar(50),
@GRAMMER nvarchar(50),
@KN_LEVEL nvarchar(50),
@EXPER nvarchar(50),
@EXPER_NOW nvarchar(50),
@EXPERT ntext,
@BIRTHDAY nvarchar(50),
@CONTRY nvarchar(50),
@DEPART nvarchar(50),
@EMAIL nvarchar(50),
@HAND_CALL nvarchar(50),
@HOEM_ADRESS nvarchar(50),
@HOEM_ZIP nvarchar(50),
@HOME_CALL nvarchar(50),
@IDENTI nvarchar(15),
@LANGU_LEVEL2 nvarchar(50) ,
@LANGU2 nvarchar(50),
@PLACE nvarchar(50),
@PLACE_ADRESS nvarchar(50),
@PLACE_CLASS SmallInt,
@PLACE_PHONE1 nvarchar(50),
@PLACE_PHONE2 nvarchar(50),
@PLACE_ZIP nvarchar(50),
@SMHAND_CALL nvarchar(50),
@TELE nvarchar(50)

)

AS
/* SET NOCOUNT ON */
INSERT INTO EXPERT
(
NAME, SEX, ZHICHEN, ZHIWU, LANGU1, LAGU_LEVEL1, GRAMMER, KN_LEVEL, EXPER, EXPER_NOW, EXPERT, BIRTHDAY, CONTRY, DEPART, EMAIL, HAND_CALL, HOEM_ADRESS, HOEM_ZIP, HOME_CALL, IDENTI, LANGU_LEVEL2, LANGU2, PLACE, PLACE_ADRESS, PLACE_CLASS, PLACE_PHONE1, PLACE_PHONE2, PLACE_ZIP, SMHAND_CALL, TELE
)

VALUES

(
@NAME, @SEX, @ZHICHEN, @ZHIWU, @LANGU1, @LAGU_LEVEL1, @GRAMMER, @KN_LEVEL, @EXPER, @EXPER_NOW, @EXPERT, @BIRTHDAY, @CONTRY, @DEPART, @EMAIL, @HAND_CALL, @HOEM_ADRESS, @HOEM_ZIP, @HOME_CALL, @IDENTI, @LANGU_LEVEL2, @LANGU2, @PLACE, @PLACE_ADRESS, @PLACE_CLASS, @PLACE_PHONE1, @PLACE_PHONE2, @PLACE_ZIP, @SMHAND_CALL, @TELE
)

SELECT
@ExpertId = @@Identity
RETURN

当然最后一句是为了返回增加的ID号的。

调用过程:

SqlParameter[] sqlPara=new SqlParameter[31];
sqlPara[0] = new SqlParameter("@EXPERTId", SqlDbType.Int );
sqlPara[0].Direction = ParameterDirection.Output;

sqlPara[1] = new SqlParameter("@NAME", SqlDbType.NVarChar,50 );
sqlPara[1].Value= NameBox.Text;

sqlPara[2] = new SqlParameter("@SEX", SqlDbType.Int );
sqlPara[2].Value= SexList.SelectedIndex;

sqlPara[3] = new SqlParameter("@ZHICHEN", SqlDbType.NVarChar,50 );
sqlPara[3].Value= ZhichenBox.Text;

sqlPara[4] = new SqlParameter("@ZHIWU", SqlDbType.NVarChar,50 );
sqlPara[4].Value= ZhiwuBox.Text;

sqlPara[5] = new SqlParameter("@LANGU1", SqlDbType.NVarChar,50 );
sqlPara[5].Value= Lang1.Text;

sqlPara[6] = new SqlParameter("@LAGU_LEVEL1", SqlDbType.NVarChar,50 );
sqlPara[6].Value = LangLevel1.Text;

sqlPara[7] = new SqlParameter("@GRAMMER", SqlDbType.NVarChar,50 );
sqlPara[7].Value= GramBox.Text;

sqlPara[8] = new SqlParameter("@KN_LEVEL", SqlDbType.NVarChar,50 );
sqlPara[8].Value= LevelBox.Text;

sqlPara[9] = new SqlParameter("@EXPER", SqlDbType.NVarChar,50 );
sqlPara[9].Value= ExperBox.Text;

sqlPara[10] = new SqlParameter("@EXPER_NOW", SqlDbType.NVarChar,50 );
sqlPara[10].Value= AreaBox.Text;

sqlPara[11] = new SqlParameter("@EXPERT", SqlDbType.NText );
sqlPara[11].Value = ExpecalBox.Text;

sqlPara[12] = new SqlParameter("@BIRTHDAY", SqlDbType.SmallDateTime );
sqlPara[12].Value = BirthBox.Text;

sqlPara[13] = new SqlParameter("@CONTRY", SqlDbType.NVarChar,50 );
sqlPara[13].Value= CountryBox.Text ;

sqlPara[14] = new SqlParameter("@DEPART", SqlDbType.NVarChar,50 );
sqlPara[14].Value= DepartBox.Text;

sqlPara[15] = new SqlParameter("@EMAIL", SqlDbType.NVarChar ,50);
sqlPara[15].Value= EmailBox.Text;

sqlPara[16] = new SqlParameter("@HAND_CALL", SqlDbType.NVarChar,50 );
sqlPara[16].Value= Handcall.Text;

sqlPara[17] = new SqlParameter("@HOEM_ADRESS", SqlDbType.NVarChar,50 );
sqlPara[17].Value= AddressBox.Text;

sqlPara[18] = new SqlParameter("@HOEM_ZIP", SqlDbType.NVarChar,50 );
sqlPara[18].Value= HomezipBox.Text;

sqlPara[19] = new SqlParameter("@HOME_CALL", SqlDbType.NVarChar,50 );
sqlPara[19].Value= Homecall.Text;

sqlPara[20] = new SqlParameter("@IDENTI", SqlDbType.NVarChar,15 );
sqlPara[20].Value= IdentBox.Text;

sqlPara[21] = new SqlParameter("@LANGU_LEVEL2", SqlDbType.NVarChar ,50);
sqlPara[21].Value= LangLevel2.Text;

sqlPara[22] = new SqlParameter("@LANGU2", SqlDbType.NVarChar ,50);
sqlPara[22].Value= Lang2.Text;

sqlPara[23] = new SqlParameter("@PLACE", SqlDbType.NVarChar ,50);
sqlPara[23].Value= CopBox.Text;

sqlPara[24] = new SqlParameter("@PLACE_ADRESS", SqlDbType.NVarChar ,50);
sqlPara[24].Value= CopaddressBox.Text;

sqlPara[25] = new SqlParameter("@PLACE_CLASS", SqlDbType.SmallInt );
sqlPara[25].Value= PlaceList.SelectedIndex;

sqlPara[26] = new SqlParameter("@PLACE_PHONE1", SqlDbType.NVarChar,50 );
sqlPara[26].Value= PlacecallBox1.Text;

sqlPara[27] = new SqlParameter("@PLACE_PHONE2", SqlDbType.NVarChar,50 );
sqlPara[27].Value = PlacecallBox2.Text;

sqlPara[28] = new SqlParameter("@PLACE_ZIP", SqlDbType.NVarChar ,50);
sqlPara[28].Value = PlacezipBox.Text;

sqlPara[29] = new SqlParameter("@SMHAND_CALL", SqlDbType.NVarChar,50 );
sqlPara[29].Value= Smallcall.Text;

sqlPara[30] = new SqlParameter("@TELE", SqlDbType.NVarChar ,50);
sqlPara[30].Value= FaxBox.Text;

SqlHelper.ExecuteNonQuery(sqlConnection1.ConnectionString, CommandType.StoredProcedure, "InsetExpert", sqlPara);

int expertId = (int)sqlPara[0].Value;//这个为取得过程的返回值。

注意返回的参数值先要进行 output定义。

sqlPara[0] = new SqlParameter("@EXPERTId", SqlDbType.Int );
sqlPara[0].Direction = ParameterDirection.Output;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: