在VS2005中,强类型数据集得到了很大的增强.在2003中基于强类型数据集,还有些迁强.而在VS2005中,使用强类型数据集进行程序开发,非常的快速方便.使用您的数据库中有很多表使用了自定义的主键,还能很方便的使用强类型数据集吗?经过一段时间的摸索,终于找到了比较简单的方法.我这里举一个智能客户端程序的例子,拿出来和大家一块分享.
1.创建一个WebService项目和一个WinForm项目
2.在WebService添加一个强类型数据集,命名为DocDs.xsd。然后,从“对象资源管理器”拖过来一个数据表(事先在管理器中已经创建目标数据库并连接),如WF_WDB。这时会生成数据集的相关代码。
3.编写生成自定义自增主键的存储过程和WF_WDB插入数据的存储过程,如下:
--
获取最大申报编号

/**/
/* 调用方法例子
--获取最大申报编号
declare @v_sq_id_max DM_短申报代码
exec Get_SBBH 'SB_SB','V_SBBH',@v_sq_id_max output
print @v_sq_id_max
*/
ALTER
PROCEDURE
Get_SBBH
(
@tab_MC
varchar
(
50
),
--
表名
@Key_MC
varchar
(
50
),
--
主键名
@OUT_V
DM_短申报代码 OUTPUT
)
AS

/**/
/* SET NOCOUNT ON */
Begin
Transaction

declare
@v_rq
varchar
(
10
)
declare
@v_sq_id_max
DM_短申报代码
declare
@v_sq_id
DM_短申报代码
declare
@strSql
nvarchar
(
255
)
Set
@v_rq
=
Convert
(
char
(
8
),
getDate
(),
112
)
--
日期字符串序列
--
生成申请ID
set
@strSql
=
'
Select @v_sq_id_max=isnull(Max(
'
+
@Key_MC
+
'
),
''
000001
''
) from
'
+
@tab_MC
exec
sp_executesql
@strSql
,N
'
@v_sq_id_max DM_短申报代码 out
'
,
@v_sq_id_max
out
If
@v_sq_id_max
=
'
000001
'
Begin
Set
@v_sq_id
=
@v_rq
+
@v_sq_id_max
End
Else
if
@v_sq_id_max
=
'
999999
'
Begin
rollback
Transaction
;
Set
@out_v
=
'
-900
'
RAISERROR
(
13001
,
16
,
10
,
'
主键溢出
'
)
End
Else
Begin
Set
@v_sq_id
=
@v_rq
+
Right
(
convert
(
varchar
(
8
),
Convert
(numeric(
8
),
Right
(
@v_sq_id_max
,
6
))
+
1000001
),
6
)
End
print
'
@v_sq_id:
'
+
@v_sq_id
;
if
@@ERROR
<>
0
begin
rollback
Transaction
;
Set
@out_v
=
'
-100
'
RAISERROR
(
13001
,
16
,
10
,
'
插入失败
'
)
end
if
@@ERROR
=
0
begin
commit
Transaction
set
@OUT_V
=
@v_sq_id
end
ALTER
PROCEDURE
dbo.InsertWF_WDB
(
@V_WD_DM
DM_短申报代码 output,
@V_WD_MC
varchar
(
60
),
@V_WD_BM
varchar
(
60
),
@V_WD_LJ
varchar
(
100
)
)
AS
SET
NOCOUNT
OFF
;
Begin
Begin
Transaction
--
生成主键
declare
@v_sq_id_max
DM_短申报代码
exec
Get_SBBH
'
WF_WDB
'
,
'
V_WD_DM
'
,
@V_WD_DM
output
--
插入数据
INSERT
INTO
[
WF_WDB
]
(
[
V_WD_DM
]
,
[
V_WD_MC
]
,
[
V_WD_BM
]
,
[
V_WD_LJ
]
)
VALUES
(
@V_WD_DM
,
@V_WD_MC
,
@V_WD_BM
,
@V_WD_LJ
);

--
返回值处理
if
@@ERROR
<>
0
begin
rollback
Transaction
;
Set
@V_WD_DM
=
'
-100
'
RAISERROR
(
13001
,
16
,
10
,
'
插入失败
'
)
end
if
@@ERROR
=
0
begin
commit
Transaction
end
END
4.点击WF_WDBTableAdapter,在属性窗口中,设置InsertCommand的值,CommandType为StoredProcedure,CommandText=InsertWF_WDB。注意,这里要检查参数集合,设置自增主键字段为Direction为Output,并为每个参数设定SourceColumn.设置完成后保存。
5.新建一个Web服务程序DocManage.asmx,添加方法SelectWF_WDMBB()和Update,保存并生成。代码如下
/**/
/// <summary>
/// 查询文档表
/// </summary>
/// <returns>WF_WDBDataTable</returns>
[WebMethod]
public
NSamWebService.DataSet.DocDs.WF_WDBDataTable SelectWF_WDB()

...
{
NSamWebService.DataSet.DocDsTableAdapters.WF_WDBTableAdapter apWf_wdb = new NSamWebService.DataSet.DocDsTableAdapters.WF_WDBTableAdapter();
NSamWebService.DataSet.DocDs.WF_WDBDataTable dt = new NSamWebService.DataSet.DocDs.WF_WDBDataTable();
apWf_wdb.Fill(dt);
return dt;
}

/**/
/// <summary>
/// 更新文档表
/// </summary>
/// <param name="dt">WF_WDBDataTable</param>
/// <returns></returns>
[WebMethod]
public
int
Update(DocDs.WF_WDBDataTable dt)

...
{
NSamWebService.DataSet.DocDsTableAdapters.WF_WDBTableAdapter apWf_wdb = new NSamWebService.DataSet.DocDsTableAdapters.WF_WDBTableAdapter();
return apWf_wdb.Update(dt);
}
6.在WinForm项目中,添加Web引用,再添加一个Form,从工具箱拖来一个DataGridView,选择数据源绑定到WF_WDB,并加入测试代码.
NSamClient.DocManage.DocDs.WF_WDBDataTable dt
=
new
NSamClient.DocManage.DocDs.WF_WDBDataTable();
NSamClient.DocManage.DocManage docManage1
=
new
NSamClient.DocManage.DocManage();

//
装载
private
void
文档表_List_Load(
object
sender, EventArgs e)

...
{
dt = this.docManage1.SelectWF_WDB();
this.wFWDMBBBindingSource.DataSource = dt;
}
//
更新
private
void
button1_Click(
object
sender, EventArgs e)

...
{
docManage1.UpdateWF_WDB(dt);
}