存储过程在代码中返回全部,但在手动触发时返回单行

时间:2015-01-26 23:23:40

标签: c# stored-procedures ado.net sqldataadapter

我从未使用过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;

3 个答案:

答案 0 :(得分:0)

尝试使用SqlDataReader而不是ExecuteNonQuery,如下所示:

con.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);

ExecuteReader允许您从SQLCommand中读取结果集。

ExecuteNonQuery只返回一个整数值,表示受该命令影响的数据库中的行数。

答案 1 :(得分:0)

想出来,第二个参数'StudentNameFragment'作为空字符串而不是null传递,所以它返回了所有内容。

答案 2 :(得分:-2)

ExecuteNonQuery - 实际上不应该与SELECT一起使用 - 只更新,插入或删除。并且它不会返回行...根据MSDN - 请参阅下面的链接

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery%28v=vs.110%29.aspx