微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server和.NET:在代码中插入失败(静默!),但在手动运行时则不行

我的插入存储过程:
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

我手动跑了瞧!实际的sql服务器错误(!):

将数据类型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的同一查询无声地失败.

原文地址:https://www.jb51.cc/mssql/77125.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐