关于数据库表字段类型与存储过程类型定义

无人久伴 提交于 2019-11-28 23:44:27

做开发已级有了三年多的时间,今天碰到一个很奇怪的现象。我们项目采用的是三层结构+Ado.net的框架模式。具体的框架运今暂不讨论,现在讨论最近遇到的一个问题。前台页面是通过Ajax请求到HttpHandler里面获取服务端数据。

通过监视得知前台的传递的参数是没有问题,里面的值也没有被截取,但是执行存储过程后的,到表里面查询出来的数据所有字段都保存首个字。数据库表里面的定义的字段类型是varchar类型,而在存储过程定义接收参数的时候,把该类型定义为nvachar,并且没有指明具体的长度。具体的表结构如下:执行SQL脚本

CREATE TABLE [dbo].[tbProcedure_Feedback](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CarId] [int] NOT NULL,
	[AgreeTransferPlace] [varchar](50) NOT NULL,
	[Descript] [varchar](200) NULL,
	[CarDescript] [varchar](200) NULL,
	[Managers] [varchar](50) NULL,
	[IsPay] [varchar](50) NULL,
	[OperName] [varchar](50) NOT NULL,
	[Created] [datetime] NOT NULL,
	[DeleteTag] [bit] NOT NULL,
	[OperTag] [tinyint] NOT NULL)

  没修改的存储过程

View Code
USE [DFAUCTION]
GO
/****** Object:  StoredProcedure [dbo].[CYP_InsertBuss]    Script Date: 03/15/2013 09:28:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[CYP_InsertBuss]
(
@CarId int,
@AgreeTransferPlace nvarchar,
@Descript nvarchar,
@CarDescript nvarchar,
@Managers nvarchar,
@IsPay nvarchar,
@OperName nvarchar,
@Created datetime,
@DeleteTag bit,
@OperTag int,
@result int output
)
as
begin 
declare @allerror int=0
declare @ProcedureAll bit
begin tran
select @ProcedureAll=ProcedureAll from tbProcedure_FrontlineCard where OperTag=1 and CarId=@CarId
insert into [tbProcedure_Feedback] (
CarId,AgreeTransferPlace,Descript,CarDescript,Managers,IsPay,OperName,Created,DeleteTag,OperTag)
values(@CarId,@AgreeTransferPlace,@Descript,@CarDescript,@Managers,@IsPay,@OperName,@Created,@DeleteTag,@OperTag)
set @allerror=@allerror+@@ERROR
set @result=1

if(exists(select Id from   tbSearch_CarStats Where CarId=@CarId  and  Status>=6))
begin
--判断是否存在一线交接单 是否收款 是否收款的验证MoneyStatus 
if(@ProcedureAll=1 )
begin
update tbCar_BaseInfoTwo set TransferTag=1 where CarId=@CarId
set @result=3 --表示可以流转数据
set @allerror=@allerror+@@ERROR
end
else
begin
set @result=2 --代表没有一线交接单
end

end
else
begin
set @result=4 --代表该车没有收款
end

if(@allerror>0)
begin
rollback tran

end
else
begin
commit tran
end

end

当执行Insert操作时,数据库的全部变成只显示一个字,结果如下:,不管输入的字数的多长。插入到数据库都是显示首字,经过思考,现将存储过程改下类型,并指明长度。修改具体如下:

修改后的存储过程
 1 USE [DFAUCTION]
 2 GO
 3 /****** Object:  StoredProcedure [dbo].[CYP_InsertBuss]    Script Date: 03/15/2013 09:28:05 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 ALTER proc [dbo].[CYP_InsertBuss]
 9 (
10 @CarId int,
11 @AgreeTransferPlace varchar(50),
12 @Descript varchar(200),
13 @CarDescript varchar(200),
14 @Managers varchar(50),
15 @IsPay varchar(50),
16 @OperName varchar(50),
17 @Created datetime,
18 @DeleteTag bit,
19 @OperTag int,
20 @result int output
21 )
22 as
23 begin 
24 declare @allerror int=0
25 declare @ProcedureAll bit
26 begin tran
27 select @ProcedureAll=ProcedureAll from tbProcedure_FrontlineCard where OperTag=1 and CarId=@CarId
28 insert into [tbProcedure_Feedback] (
29 CarId,AgreeTransferPlace,Descript,CarDescript,Managers,IsPay,OperName,Created,DeleteTag,OperTag)
30 values(@CarId,@AgreeTransferPlace,@Descript,@CarDescript,@Managers,@IsPay,@OperName,@Created,@DeleteTag,@OperTag)
31 set @allerror=@allerror+@@ERROR
32 set @result=1
33 
34 if(exists(select Id from   tbSearch_CarStats Where CarId=@CarId  and  Status>=6))
35 begin
36 --判断是否存在一线交接单 是否收款 是否收款的验证MoneyStatus 
37 if(@ProcedureAll=1 )
38 begin
39 update tbCar_BaseInfoTwo set TransferTag=1 where CarId=@CarId
40 set @result=3 --表示可以流转数据
41 set @allerror=@allerror+@@ERROR
42 end
43 else
44 begin
45 set @result=2 --代表没有一线交接单
46 end
47 
48 end
49 else
50 begin
51 set @result=4 --代表该车没有收款
52 end
53 
54 if(@allerror>0)
55 begin
56 rollback tran
57 
58 end
59 else
60 begin
61 commit tran
62 end
63 
64 end

再次执行Insert已经正常将数据插入。

以上是遇到的MSSQL定义字段与存储过程接收的类型不匹配导致的,希望能够给大家以后在开发一个提醒。文章有点罗嗦,有不对的地方,请大家指正.

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!