SQL Server7 & Delphi5 分数多多!!!(300分)

  • 主题发起人 主题发起人 秦浩天
  • 开始时间 开始时间

秦浩天

Unregistered / Unconfirmed
GUEST, unregistred user!
在下初学C/S编程,现有3个问题如下望各位大虾赐教:
1.有一个Table 主键ID varchar(6),如何实现用Storeprocdure and TRIGGER
实现每插入一条纪录ID自动加1,如:D10001,D10002,D10003...
注:如果 ID 是数值型可以设置 IDENTITY 但是这里是 varchar。(100分)
2. 有表如下:
TABLE1: ID NAME JGDM YYJGDM ---主表
TABLE2: JGDM JG ---字典
其中 TABLE1中 JGDM 各 YYJGDM 的值都来自 TABLE2,
JGDM为现值,YYJGDM为原有的值。
现要建立视图 View1 把 "代码" 转换成对应的"值"以方便查询,用如下VIEW却不行,
不知应如何做?表结构是否合理。
CREATE VIEW View1 AS
SELECT A.ID,A.NAME,B.JG,B.JG AS YYJG
FROM TABLE1 A,TABLE2 B
WHERE A.JGDM*=B.JGDM
AND A.YYJGDM*=B.JGDM (100分)
3. 哪位大虾能给提供一些在Delphi5中通过ADO使用SQL Server 的
Storeprocdure / Trigger / view的例子给在下。 (200分)
 
1,
设置一个可以自动增加的字段,数字类型,出现:10001,10002.....
一个字段是计算类型,出现D10001,D10002,....
(主键的作用达到了,所以么。。)
 
3
例子?
Delphi5/Demo/ado

 
let me think
 
to 千中元:可用户就喜欢用 varchar 类型的主键。是否能通过增加一
IDENTITY 类型的字段,在 Insert Trigger 中把值传给 ID,我知道在
Interbase中可以这样做,但不知Sql server中如何实现。
/* Create Generator for SET_CUST_NO trigger */

CREATE GENERATOR cust_no_gen;
SET GENERATOR cust_no_gen to 1015;

/* Create trigger to add unique customer number */

SET TERM !! ;
CREATE TRIGGER set_cust_no FOR customer
BEFORE INSERT AS
BEGIN
new.cust_no = gen_id(cust_no_gen, 1);
END !!

to wrench: Delphi5/Demo/ado好象没有通过ADO使用SQL Server 的
Storeprocdure / Trigger / view的例子。

 
》可用户就喜欢用 varchar 类型的主键。?
用户知道什么是主键?他只能看到第一个,如果你用DBGrid的话,可以把显示
D10001的字段放到前面么。根本不让他看见有10001这个字段。
我也是只看过interbase创建触发器的这样的例子,技术内幕上。呵呵。
 
你應該充分利用前臺的顯示格式.
 
1.
declare @ID varchar(6)
declare @ID1 varchar(5)
select @ID=Max(ID) from Table1
if @ID is Null
begin
Select @ID='D00000'
end
select @ID1=SubString(@ID,2,5)
select @ID1=Convert(varchar(5),Convert(varchar(5),@ID1+1))
select @ID1=SubString('00000',1,5-len(@ID1))+@ID1
select @ID=SubString(@ID,1,1)+@ID1

2.Table1和Table2的关系没有说清楚

3.先建立ADOConnection
Storeprocdure 用TStoredProc
View是一个只读的Table
 
to caiaj:
1.能不能只通过在SQL SERVER中写storeprocedure and trigger
实现以上功能,我知道在Interbase中可以做到,如下(并不需要在Delphi
中调用存储过程):
/* Create Generator for SET_CUST_NO trigger */

CREATE GENERATOR cust_no_gen;
SET GENERATOR cust_no_gen to 1015;

/* Create trigger to add unique customer number */

SET TERM !! ;
CREATE TRIGGER set_cust_no FOR customer
BEFORE INSERT AS
BEGIN
new.cust_no = gen_id(cust_no_gen, 1);
END !!

2.关于第二个问题我的意思是,如果一个表中有2个字段与同一表形成
JOIN时如何处理?
 
CREATE VIEW View1 AS
SELECT A.ID,A.NAME,B.JG,C.JG AS YYJG
FROM TABLE1 A,TABLE2 B,TABLE2 C
WHERE A.JGDM*=B.JGDM
AND A.YYJGDM*=C.JGDM (100分)

没有试,大致如此!
 
To gxg8816 : I will try it.
顺便问一下谁知道 Delphi5中 ADO控件中,ADODataSet ADOTable ADOQuery
ADOStoreProcedure 之间有什么区别?什么情况下该用什么控件?
1.比如 SQL Server 中的 View,Table 可通过 ADODataSet 访问,也可通过
ADOTable 访问,StoreProcedure 可通过 ADODataset或 ADOStoreProcedure
访问。
2.通过 ADODataSet 控件访问 SQL Server 中的 View 与通过在 ADOQuery中写
SQL 语句,建立查询有什么区别,那个性能更好一些?
3.powerbuilder中可以直接操纵 Cursor ,不知 Delphi 中是否有类似功能.
 
1,如果不想用IDENTITY字段也可以在其他表中专门用一个字段存放目前的
最大数字,用Trigger控制,每次插入时从外面那个字段中去取并刷新该字段。
只不过多用几个字符和数字转换的函数如Cast、Convert。祥见T-SQL帮助。

2,应该这样写:
CREATE VIEW View1 AS
SELECT A.ID,A.NAME,B.JG,C.JG AS YYJG
FROM TABLE1 A
join TABLE2 B on A.JGDM*=B.JGDM
join TABLE2 C on A.YYJGDM*=C.JGDM

3,使用存储过程:
//如果存储过程有返回结果,则
ADOQuery1.Sql.Text := 'select * from sp_name';
ADOQuery1.Open;
//如果存储过程没有返回结果,则为
ADOQuery1.Sql.Text := 'exec sp_name 100';//100是传给SP的参数,可选
另外:Trigger是自动触发执行的,不必在ADO中调用。
View其实是虚拟的表,和表的操作一样。注意的是牵涉多个表的、或者带计算结果
的View 都是只读的。
 
——ADO控件中,ADODataSet ADOTable ADOQuery,ADOStoreProcedure 之间
——有什么区别?什么情况下该用什么控件?

ADOTable,ADOQuery,ADOStoreProcedure基本上和其对应的DBTable,
DBQuery,DBStoreProcedure差不多。

ADOTable封转简化了一些数据库操作,

而ADOQuery则可以充分利用SQl的灵活性,ADOStoreProcedure用来调
用数据库中的存储过程(其实在ADOQuery里直接用SQL调用也差不多)

至于ADODataSet,有点怪怪的,感觉像ADOTable
和ADOQuery的杂交,设置其CommandType 和CommandText属性可以打开
一个表或者执行一个Select式的Sql命令,但是ADOCommand不能执行
DELETE, INSERT, UPDATE这样的操作。
 
To adminis :同意您的做法,但在Trigger中,如何只刷新当前插入的记录?
SQL Server 中好象没有 Interbase 中的 NEW 与 OLD Table。
 
如果你一次插入一批,Trigger不能做到,除非在Trigger中又循环一次。
SQL7的Trigger 可以这样写:
Create Trigger TR_name on Tbl_name
for insert
as
begin
/* 先从别的地方取得一个不重复的数 */
...
update inserted set ID=@ID
...
end
注意上面的 inserted。它是一个SQL7自动产生的临时表,包含你插入的记录。
对它的操作跟 tbl_name 的操作是一样的。可以用select * from inserted
来访问。如果你一次插入一行,那么可以直接改 inserted 中的字段;
如果一次插入多行,给每行一个关键字,可以用cursor 在 inserted 表里面循环,每行给一个不同的值。
具体的做法可以自己试一试。
 
To adminis: SQL Server 提示 Inserted 表不可用 Update.
 
问题好象被你们解决了,我来迟了。
 
感谢各位热心解答,现在论功行赏。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
I
回复
0
查看
843
import
I
后退
顶部