文档章节

使用SqlDataSource调用带参数存储过程(获取不到数据?)

leet123
 leet123
发布于 2016/03/28 15:30
字数 950
阅读 67
收藏 0

最近被朋友问到一个SqlDataSource调用带参数存储过程为什么不成功,代码如下:

string user_name = ((TextBox)this.DetailsView1.Rows[1].Cells[1].Controls[0]).Text.ToString().Trim();  
 
string pass_word = ((TextBox)this.DetailsView1.Rows[2].Cells[1].Controls[0]).Text.ToString().Trim();  
SqlDataSource1.InsertCommand
= "pro_newUser";  
SqlDataSource1.InsertCommandType
= SqlDataSourceCommandType.StoredProcedure;  
 
SqlDataSource1.InsertParameters.Add(
"x", TypeCode.String, user_name);  
SqlDataSource1.InsertParameters.Add(
"y", TypeCode.String, pass_word);  
 
SqlDataSource1.Insert()  

        是啊,为什么不成功呢,提示的消息是太多的参数,这段代码看起来没什么问题啊。几轮搜索以后,觉得网上说的种种原因,最可能的是参数名要和字段名一致和参数要加@于是改成:

string user_name = ((TextBox)this.DetailsView1.Rows[1].Cells[1].Controls[0]).Text.ToString().Trim();   
  
string pass_word = ((TextBox)this.DetailsView1.Rows[2].Cells[1].Controls[0]).Text.ToString().Trim();   
SqlDataSource1.InsertCommand = "pro_newUser";   
SqlDataSource1.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;   
  
SqlDataSource1.InsertParameters.Add("@empNo", TypeCode.String, user_name);   
SqlDataSource1.InsertParameters.Add("@empName", TypeCode.String, pass_word);   
  
SqlDataSource1.Insert()

存储过程里也进行相应的修改,把定义的传入参数和调用的地方都改为@empNo,@empName,仍然失败!错误消息变成了

Procedure or Function 'asdfg' expects parameter '@empNo', which was not supplied.就是没找到@empNo,此时,我有点迷茫。

于是把@去掉,再试,成功。代码如下:

1
2
3
4
5
<p> </p>
<div onclick=     "cnblogs_code_show('dc866ee1-3108-4db4-9dae-a8349ca9953b')"           class     =     "cnblogs_code"           style=     "width: 1063px; height: 327px;"     ><div     class     =     "cnblogs_code_toolbar"     ><span     class     =     "cnblogs_code_copy"     ><a href=     "javascript:void(0);"           onclick=     "copyCnblogsCode(this)"           title=     "复制代码"     ><img src=     "http://common.cnblogs.com/images/copycode.gif"           alt=     "复制代码"     ></a></span></div><img src=     "http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"           class     =     "code_img_closed"           id=     "code_img_closed_dc866ee1-3108-4db4-9dae-a8349ca9953b"     ><img src=     "http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"           onclick=     "cnblogs_code_hide('dc866ee1-3108-4db4-9dae-a8349ca9953b',event)"           class     =     "code_img_opened"           id=     "code_img_opened_dc866ee1-3108-4db4-9dae-a8349ca9953b"           style=     "display: none;"     ><span     class     =     "cnblogs_code_collapse"     >代码</span><div     class     =     "cnblogs_code_hide"           id=     "cnblogs_code_open_dc866ee1-3108-4db4-9dae-a8349ca9953b"     ><pre><div><!--<br /><br />Code highlighting produced     by           Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style=     "color: #000000;"     ><p><span style=     "background-color: #f5f5f5; font-family: Courier New;"     >     string           user_name = ((TextBox)     this     .DetailsView1.Rows[1].Cells[1].Controls[0]).Text.ToString().Trim();</span></p><p><span style=     "background-color: #f5f5f5; font-family: Courier New;"     >            string           pass_word = ((TextBox)     this     .DetailsView1.Rows[2].Cells[1].Controls[0]).Text.ToString().Trim();<br>        SqlDataSource1.InsertCommand =     "pro_newUser"     ;<br>        SqlDataSource1.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;</span></p><p><span style=     "background-color: #f5f5f5; font-family: Courier New;"     >        SqlDataSource1.InsertParameters.Add(     "empNo"     , TypeCode.String, user_name);<br>        SqlDataSource1.InsertParameters.Add(     "empName"     , TypeCode.String, pass_word);</span></p><p><span style=     "background-color: #f5f5f5; font-family: Courier New;"     >        SqlDataSource1.Insert()</span></p><br><br></span></div></pre>
</div>
<div     class     =     "cnblogs_code_toolbar"     ><span     class     =     "cnblogs_code_copy"     ><a href=     "javascript:void(0);"           onclick=     "copyCnblogsCode(this)"           title=     "复制代码"     ><img src=     "http://common.cnblogs.com/images/copycode.gif"           alt=     "复制代码"     ></a></span></div></div>
<p> </p>

但是会产生两条数据,这段代码是写在DetailsView1_ItemInserting里的,根据以前的经验,这个方法在点DetailsView1的插入按钮时触发,只要InsertCommand中有代码,就会去执行,那么最后的一句SqlDataSource1.Insert()具有相同的作用,所以等于把insertCommand执行了两次,所以会有两条数据。

很奇怪,我一直觉得我遇到的问题别人也一定会遇到过,但是这个例外,尝试了各种搜索条件,没有这个问题。所有的文章都说调用存储过程传参要用@占位符。

------------------------------------------

以上是网上的一篇文章, 确实解决了我的一个问题:

使用参数时用@会提示你给参数赋值, 去掉@,直接使用参数名称就可以了.

同时我还遇到了另外一个问题:

执行sr.Select(new DataSourceSelectArguments());时始终未null

最终解决:

        sr.ConnectionString ="连接字符串";

            sr.SelectCommand = "UP_Report_Storage_ReportPutInCompare1";
            sr.DataSourceMode = SqlDataSourceMode.DataSet;           
            sr.SelectCommandType = SqlDataSourceCommandType.StoredProcedure;
            sr.SelectParameters.Add("InWarehouseName", DbType.AnsiString, "惠州_实体仓");      //参数名不带@     
            sr.SelectParameters.Add("dateMonth", DbType.AnsiString, "201512");           
            sr.SelectParameters.Add("MatCodeName", DbType.AnsiString, "");//不能给存储过程参数赋空值""和null
           

            DataView ds1 = (DataView)sr.Select(new DataSourceSelectArguments());

 总结:

对于查询时用到的可选参数, 不能使用""和null赋值, 虽然这样可以偷点小懒,但是查询不到结果,找问题时很不容易的;

一般可以采取如下做法:

给存储过程参数一个默认值, 这样该参数就是可选参数了, 程序使用时,如不查询该字段,则不给其赋值.

 

© 著作权归作者所有

leet123
粉丝 0
博文 22
码字总数 3908
作品 0
高级程序员
私信 提问
创建带 IN 和 OUT 参数的 MySQL 存储过程

在 MySQL 中创建储存过程的语法很难记,除非你经常跟储存过程打交道,原因很简单,语法不是什么小笑话。如果你通过命令行控制 MySQL,你需要记住准确的语法。一个快速示例可以很好的帮助你做...

oschina
2013/03/12
11.6K
7
Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 一:事务 首先看一下什么是事务: 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,...

长平狐
2012/11/12
78
0
DevExpress v15.1:Reporting控件功能增强(二)

<下载最新版DevExpress Reporting v15.1.5> 增强跨平台功能 多值查找参数 现在,您可以创建一个可以存储多个值的参数。在打印预览中默认编辑器的这些参数是一个多选下拉列表,这允许最终用户...

Miss_Hello_World
2015/08/31
218
0
ibatis教程之调用带参数的存储过程

ibatis调用带参的存储过程,包括存储过程带有多个输入输出参数,整个开发过程如下: 1. 编写存储过程,以下存储过程分别带有三个输入参数,两个输出参数。 CREATE PROCEDURE [dbo].[sp_statJ...

xinlll
2012/11/08
102
0
如何在Linux中用命令行工具管理KVM虚拟环境

第一步: 配置存储池 Virsh命令行工具是一款管理virsh客户域的用户界面,它能在命令行中运行所给的命令以及它的参数,我们要用它给我们的KVM环境创建存储池,想知道关于这个工具的更多信息,用...

linuxprobe16
2016/11/23
27
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
今天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
今天
6
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
今天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.5K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部