做开发已级有了三年多的时间,今天碰到一个很奇怪的现象。我们项目采用的是三层结构+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 CodeUSE [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定义字段与存储过程接收的类型不匹配导致的,希望能够给大家以后在开发一个提醒。文章有点罗嗦,有不对的地方,请大家指正.
来源:http://www.cnblogs.com/liaoxiaogang/archive/2013/03/15/2960917.html