存储过程返回所有代码,但手动触发时返回单行
Posted
技术标签:
【中文标题】存储过程返回所有代码,但手动触发时返回单行【英文标题】:Stored Proc returns all in code, but single row when fired manually 【发布时间】:2015-01-26 23:23:40 【问题描述】:我从未使用过 ADO.NET。 如果我手动执行,我有一个存储过程,它需要一个学生编号并返回一个学生。
如果我在我的代码中执行它,它会返回所有 6000 名学生。在代码中执行有什么不同?
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["My_DB"].ConnectionString.ToString()))
using (SqlCommand cmd = new SqlCommand("sk.My_StoredProc", con))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
cmd.CommandType = CommandType.StoredProcedure;
//Add Parameter values
cmd.Parameters.Add("@StudentNumber", SqlDbType.VarChar).Value = studentNumber;
cmd.Parameters.Add("@StudentNameFragment", SqlDbType.VarChar).Value = studentNameFragment;
cmd.Parameters.Add("@SchoolYear", SqlDbType.VarChar).Value = this.schoolYr;
con.Open();
cmd.ExecuteNonQuery();
da.Fill(dt);
return dt;
【问题讨论】:
可能是参数值设置不正确(在 C# 代码中),或者可能!您手动执行的代码是在不同的数据库上执行的,您能否显示存储过程代码以及在 C# 代码中为参数设置分配值的位置?也可以在那里尝试remove cmd.ExecuteNonQuery()
【参考方案1】:
尝试使用 SqlDataReader 而不是 ExecuteNonQuery,如下所示:
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
ExecuteReader 将允许您从 SQLCommand 读取结果集。
ExecuteNonQuery 将只返回一个整数值,表示您的数据库中受该命令影响的行数。
【讨论】:
我终于有时间试一试,它给了我一个错误,“已经有一个打开的 DataReader 与此命令关联,必须先关闭。” 我怀疑您打开连接两次或更多次。确保 con.Open();只出现一次。你能发布你对这段代码的最新编辑吗? 代码目前与 OP 保持一致。由于“使用”语句,我应该需要专门关闭连接,对吧?【参考方案2】:想通了,第二个参数“StudentNameFragment”是作为空字符串而不是 null 传递的,所以它返回了所有内容。
【讨论】:
【参考方案3】:ExecuteNonQuery - 不应该与 SELECT 一起使用 - 仅更新、插入或删除。而且它不返回行...根据 MSDN - 请参阅下面的链接
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery%28v=vs.110%29.aspx
【讨论】:
这是评论,不是答案 你是对的 - 我是新成员,这是我的第一个答案 - 或者我应该说评论 - 我现在知道它是如何工作的。 欢迎来到 SO!你可以删除这个“问题”,负分就会被删除。以上是关于存储过程返回所有代码,但手动触发时返回单行的主要内容,如果未能解决你的问题,请参考以下文章