存储过程返回所有代码,但手动触发时返回单行

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!你可以删除这个“问题”,负分就会被删除。

以上是关于存储过程返回所有代码,但手动触发时返回单行的主要内容,如果未能解决你的问题,请参考以下文章

Sqlserver中存储过程,触发器,自定义函数

MySQL高级存储过程/函数/触发器

触发器调用存储过程,如果我们进行选择,返回值是新的还是旧的?

oracle存储过程和存储函数&触发器

java捕获不到存储过程里面手抛的错误

存储过程不返回结果,但查询返回