ALTER procedure proj_ins_all ( @proj_number INT,@usr_id INT,@download DATETIME,@status INT ) as INSERT INTO project (proj_number,usr_id,date_download,status_id) VALUES (@proj_number,@usr_id,@download,@status) select SCOPE_IDENTITY()
…手动调用时运行正常,如下所示:
exec proj_ins_all 9001210,2,'2009-09-03',2
…但是从代码调用时:
_id = data.ExecuteIntScalar("proj_ins_all",arrParams);
…插入不会发生.现在,标识列确实增加了,并且_id确实设置为它的值.但该行本身从未出现在表格中.
我能想到的最好的猜测是一个插入触发器,它删除了新插入的行,但是表上没有触发器(为什么手动完成时它会工作呢?).我的其他尝试是猜测存储过程以某种方式回滚插入,因此将begin和end以及go和分号放入存储过程中以正确分离’insert’和’identity select’位.没有任何修复.
有任何想法吗?
更新:
谢谢所有迄今为止帮助过的人.关于Preet的建议(第一个答案)我学会了如何使用sql Server Profiler(我简直不敢相信我之前从未了解过它 – 我认为它只对性能调优有用,没有意识到我可以确切地看到查询的内容带它的DB).
它揭示了sqlCommand.ExecuteScalar()方法发送的sql与我手动运行的sql略有不同.它发送:
exec proj_ins_all @proj_number=9001810,@usr_id=2,@download='2009-09-03 16:20:11.7130000',@status=2
将数据类型varchar转换为datetime时出错.
由于我是手动测试的,我只是将日期时间从’2009-09-03 16:20:11.7130000’缩短为’2009-09-03 16:20:11′,这就解决了错误;现在排好了.
但这引出了一个问题:为什么Microsoft的sql Server在该datetime参数中不能处理超过23个字符?是Microsoft的sqlCommand.ExecuteScalar()方法构建了这样的查询,而不是我.这是一个问题,因为我的代码仍然不起作用.
一旦我手动工作,我就会看到如何在代码中为日期设置sqlParameter,这样它就会发送一个有效的值.我尝试将数据类型从sqlDbType.DateTime更改为sqlDbType.SmallDateTime.分析器显示这确实产生了更短的日期时间值’2009-09-03 17:15:00′,但插入仍然无声地失败(原始问题).但是,当我从分析器复制粘贴sql并手动尝试它 – 它工作.没有错误.发送它作为varchar的相同交易 – SSMS查询窗口喜欢它,通过.net的同一查询无声地失败.