2007年8月29日星期三
binary-java
vb.net store proc
发信人: thanxMe (听说百事比可口好喝), 信区: DotNET
标 题: 在VB.NET中使用MS Access存储过程
发信站: BBS 水木清华站 (Wed May 14 18:56:54 2003), 转信
正在寻寻觅觅之际,看到这篇文章,感觉非常的high,赶紧贴出来。
如果你和我一样也正在为Access中的存储过程发愁的时候,看看这个,或许能找到点感觉
作者: DavidWasserman,MCP
2/27/2002
译者:Qianqian
3/8/2002
文章源代码: msaccess_ sp.zip
介绍
最 新发布的MS Access中,微软已经尽努力使这种产品成为一个真正全功能的关系数据库系统。 存储过程,一个通常和企业数据库系统例如 SQLServer相关的功能,现在也可以在Access里找到了。 自从Access2000以来,Access已经具备了存储过程的功能,而且是 Jet 4 Database
Engine自带的。如果你习惯于在SQL SERVER里使用存储过程,那么你就会很熟悉它们如何在Access里使用。 但是要记住有一些限制。我会稍后作讨论。
这篇文章分成两个部份。 第一部份会详细描述如何在使用ADO.NET和Visual Basic.NET在Access里创建存储过程。 第二部份则会示范如何利用在第一部分创建的存储过程来创建一个数据访问层,并且在你自己的应用程序中使用。
这篇文章中的代码已经在Access2002种测试通过,即使如此,它也应该能运行于Access2000。
存储过程如何在Access里工作?
不像在Access里的其它的对象,存储过程没有用户界面,并且不能在Access的界面里创建。 要建立它们的方法只有编码。我将示范如何在ADO.NET中实现这些代码。
当 一个存储过程被添加到Access数据库时,JET Engine会把存储过程转换到一个查询对象。 对一个Access开发者而言,这就象编写一个简单 的查询,是不必要的工作。 然而,它确实有它的优点。考虑一下,一个应用系统必须为了分开Access版和SQL SERVER版而分成2个系统的情况 吧。
使用存储过程会使为应用程序的数据库访问层写代码变得更容易,程序在不同的版本之间区别很小。
创建存储过程
为 了示范,我会先显示如何使用SQL语句来创建存储过程。 在文章末尾我会给列出需要在数据库执行的所有语句的代码。 当使用和Access包含的 Northwind数据库时,它会创建4个存储过程。 它们都集中于Prodcut表,让我们从最容易的那个开始: 选择表格里所有行的数据。
为了创建这个存储过程,在数据库执行下列SQL语句:
"CREATE PROC procProductsList AS SELECT * FROM Products;"
语句“CREATE PROC procCustomerList”是实际上创建存储过程的部份。 在”AS”下面的部分可以为任何有效的SQL语句。
经常性的,你会需要传递参数到存储过程去用于查询。 例如你可能想要根据某一个ProductID删除一个记录。 下列存储过程显示如何实现这个目的:
"CREATE PROC procProductsDeleteItem(inProductsID LONG)" _
"AS DELETE FROM Products WHERE ProductsID = inProductsID;"
在第一行,注意CREATE PROC声明右边的括号。 有一个定义为长整型的参数。 这是需要你输入的变量,用于删除记录。
下项两个分开的语句显示了如何为Product表创建一个add和一个update储存过程。注意,为了文章的简短,过程中没有包括所有的字段:
"CREATE PROC procProductsAddItem(inProductName VARCHAR(40), " _
"inSupplierID LONG, inCategoryID LONG) " _
"AS INSERT INTO Products (ProductName, SupplierID, CategoryID) " _
"Values (inProductName, inSupplierID, inCategoryID);"
"CREATE PROC procProductsUpdateItem(inProductID LONG, " _
" inProductName VARCHAR(40)) " _
"AS UPDATE Products SET ProductName = inProductName " _
" WHERE ProductID = inProductID;
注意:当参数数量超过一个的时候,用逗号分开。
限制
在这里,你可能会碰到一些限制,尤其是如果当你已经非常习惯于SQL SERVER的强大功能的时候。
不能使用输出参数。
不要使用@字符。 @字符通常用于Transaction SQL( SQL SERVER),代表一个本地变量 。 Access不总是会转换这个字符, 有时会将它省略。这个问题可能导致很难找的BUG, 会使你多掉几把头发。
Access无法存取临时表。
我怀疑在很多Transaction SQL里有的选项在Access里是没有的,因为它不是Transaction SQL兼容的。
--
[为了朋友 可以两肋插刀]
[为了MM 可以插朋友两刀]
:]
羅馬數字
羅馬數字
羅馬數字系統源自伊特魯利亞文(Etruscan),只用7個符號,包括I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。羅馬數字並沒有0。可是按照下面的規則卻可以表示任意自然數。 一般認為這套記數系統只要用來記數卻不作演算。
(1) | 重複數次決定倍數:1個羅馬數字重複幾次,就表示這個數的幾倍。例如: ⅩⅩⅩ=30. |
(2) | 右加左減:在一個較大的羅馬數字的右邊記上一個較小的羅馬數字,表示大數字加小數字。 |
(3) | 數字上加橫線乘千或乘百萬:在1個羅馬數字的上方加上1條橫線或者在右下方寫M,表示將這個數字乘以1000,即是原數的1000倍。同理,如果上方有2條橫線,即是原數的1000000倍。 |
(4) | 數碼限制:同樣數碼最多只能出現3次,如40不能表示為XXXX,而要表示為XL。但是,由於IV是古羅馬神話主神朱庇特(IVPITER,古羅馬字母沒有J和U)的首字,因此有時用IIII代替IV。 一般大時鐘(不包刮英國大笨鐘)的時刻就以IIII代替IV,也可能是為了字體的對稱性。 |
下面幾例是羅馬數字與十進位數字的轉換 |
CCLXVII | = | 200 + 50 + 10 + 5 + 1 + 1 = 267 |
MMMCCLXXXI | = | 1,000 + 1,000 + 1,000 + 100 + 100 + 50 + 10 + 10 + 10 + 1 = 3,281 |
DCCXVII | = | 500 + 100 + 100 + 10 + 5 + 1 + 1 = 717. |
[ 羅馬數字與十進位數字對照表]
用羅馬數字做加減還算方便,但是用來作乘除運算,那就是相當費時且沒效率的事了,還好羅馬人及中世紀歐洲人只是用來羅馬數字來「記」數,而「算」數時用的卻是算板。 算版就像是古中國的算籌或是近代的算盤、計算尺和現在的計算機一般。
羅馬數字系統在歐洲流行了約一千年後,到了中世紀才漸漸被印度-阿拉伯數字取代。花拉子密(Alkhwarizmi,790~840)是 一位重要的回教數學家,他在西元820年寫了一部很有影響的書,在書中他講述了印度-阿拉伯數字的十進位計數系統的用法。這本工具書後來經費波拉契(Fibonacci)(1170~1250年)引介到歐洲, 並且逐漸代替了歐洲原有的算板計算及羅馬的記數系統。 至此,歐洲人們可以擺脫繁瑣的計算步驟,卻多了很多時間用在數學思索活動上。
罗马人发明的罗马数字数字..
I II III IV V VI Ⅶ ⅧⅨ Ⅹ Ⅺ Ⅻ
V 相当于5, X 相当于10...
前面加 I,II, III 的表示相减,
后面加 I,II, III 的表示相加...
还有的在数字上方加'-'的代表1000的值,
如: ___
VII == 7000
上面加'ㄇ'的表示100000的值...
七个基本符号:
I--1, V--5, X--10, L--50, C--100, D--500, M--1000
相同的数字并列,表示相加,如:III--3, CC--200
左边数字大于右边数字,也表示相加,如:VI--6, XII--12, CLX--160
右边数字大于左边数字,表示相减,如:IV--4, CM--900
这几个方法结合起来,就能表示所有的数,如:
MCMXLV--1945, MCDXXXVIII--1488
注意相减时只能“减一个”,如9是IX, 但8不能表示成IIX, 而只能是VIII。30是XXX, 不是XXL。同样1800只能是MDCCC, 不能是MCCM
实际上,罗马数字的符号一共只有7个:I(代表1)、V(代表5)、X(代表10)、L(代表50)、C代表100)、D(代表500)、M(代表1,000)。这7个符号位置上不论怎样变化,它所代表的数字都是不变的。它们按照下列规律组合起来,就能表示任何数:
1.重复次数:一个罗马数字符号重复几次,就表示这个数的几倍。如:“III”表示“3”;“XXX”表示“30”。
2. 右加左减:一个代表大数字的符号右边附一个代表小数字的符号,就表示大数字加小数字,如“VI”表示“6”,“DC”表示“600”。一个代表大数字的符 号左边附一个代表小数字的符号,就表示大数字减去小数字的数目,如“IV”表示“4”,“XL”表示“40”,“VD”表示“495”。
3.上加横线:在罗马数字上加一横线,表示这个数字的一千倍。如:“ ”表示 “15,000”,“ ”表示“165,000”。
我 国古代也很重视记数符号,最古老的甲骨文和钟鼎中都有记数的符号,不过难写难认,后人没有沿用。到春秋战国时期,生产迅速发展,适应这一需要,我们的祖先 创造了一种十分重要的计算方法——筹算。筹算用的算筹是竹制的小棍,也有骨制的(图9)。按规定的横竖长短顺序摆好,就可用来记数和进行运算。随着筹算的 普及,算筹的摆法也就成为记数的符号了。算筹摆法有横纵两式,都能表示同样的数字.
如果要表示1971,就可以摆成如图11的样子。
从算 筹数码中没有“10”这个数可以清楚地看出,筹算从一开始就严格遵循十位进制。9位以上的数就要进一位。同一个数字放在百位上就是几百,放在万位上就是几 万。这样的计算法在当时是很先进的。因为在世界的其他地方真正使用十进位制时已到了公元6世纪末。但筹算数码中开始没有“零”,遇到“零”就空位。比如 “6708”,就可以表示为“┴ ╥ ”。数字中没有“零”,是很容易发生错误的。所以后来有人把铜钱摆在空位上,以免弄错,这或许与“零”的出现有关。不过多数人认为,“0”这一数学符号的 发明应归功于公元6世纪的印度人。他们最早用黑点(•)表示零,后来逐渐变成了“0”。
说起“0”的出现,应该指出,我国古代文字中,“零”字出 现很早。不过那时它不表示“空无所有”,而只表示“零碎”、“不多”的意思。如“零头”、“零星”、“零丁”。“一百零五”的意思是:在一百之外,还有一 个零头五。随着阿拉数字的引进。“105”恰恰读作“一百零五”,“零”字与“0”恰好对应,“零”也就具有了“0”的含义。
如果你细心观察的话,会发现罗马数字中没有“0”。其实在公元5世纪时,“0”已经传入罗马。但罗马教皇凶残而且守旧。他不允许任何使用“0”。有一位罗马学者在笔记中记载了关于使用“0”的一些好处和说明,就被教皇召去,施行了拶(zǎn)刑,使他再也不能握笔写字。
但“0”的出现,谁也阻挡不住。现在,“0”已经成为含义最丰富的数字符号。“0”可以表示没有,也可以表示有。如:气温 ,并不是说没有气温;“0”是正负数之间唯一的中性数;任何数(0除外)的0次幂等于1;0!=1(零的阶乘等于1)
除了十进制以外,在数学萌芽的早期,还出现过五进制、二进制、三进制、七进制、八进制、十进制、十六进制、二十进制、六十进制等多种数字进制法。在长期实际生活的应用中,十进制最终占了上风。
现在世界通用的数码1、2、3、4、5、6、7、8、9、0,人们称之为阿拉伯数字。实际上它们是古代印度人最早使用的。后来阿拉伯人把古希腊的数学融进了自己的数学中去,又把这一简便易写的十进制位值记数法传遍了欧洲,逐渐演变成今天的阿拉伯数字。