加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 07:05:01 所属栏目:MsSql教程 来源:网络整理
导读:我的插入存储过程: ALTER procedure proj_ins_all (@proj_number INT,@usr_id INT,@download DATETIME,@status INT )asINSERT INTO project(proj_number,usr_id,date_download,status_id)VALUES(@proj_number,@usr_id,@download,@status)select SCOPE_IDENTI
我的插入存储过程:
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的同一查询无声地失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读