Return Result from Select Query in stored procedure to a List

前端 未结 8 1998
猫巷女王i
猫巷女王i 2021-01-01 10:10

I\'m writing a stored procedure that currently contains only a SELECT query. It will be expanded to do a number of other things, which is why it has to be a sto

相关标签:
8条回答
  • 2021-01-01 10:15

    Passing Parameters in Stored Procedure and calling it in C# Code behind as shown below?

    SqlConnection conn = new SqlConnection(func.internalConnection);
    var cmd = new SqlCommand("usp_CustomerPortalOrderDetails", conn);
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.Parameters.Add("@CustomerId", SqlDbType.Int).Value = customerId;
    cmd.Parameters.Add("@Qid", SqlDbType.VarChar).Value = qid;
    conn.Open();
    
    // Populate Production Panels
    DataTable listCustomerJobDetails = new DataTable();
    listCustomerJobDetails.Load(cmd.ExecuteReader());
    conn.Close();
    
    0 讨论(0)
  • 2021-01-01 10:21
    SqlConnection con = new SqlConnection("Data Source=DShp;Initial Catalog=abc;Integrated Security=True");
    SqlDataAdapter da = new SqlDataAdapter("data", con);
    
    da.SelectCommand.CommandType= CommandType.StoredProcedure;
    
    DataSet ds=new DataSet();
    
    da.Fill(ds, "data");
    GridView1.DataSource = ds.Tables["data"];
    GridView1.DataBind();
    
    0 讨论(0)
  • 2021-01-01 10:26

    In stored procedure, you just need to write the select query like the below:

    CREATE PROCEDURE TestProcedure
    AS
    BEGIN
        SELECT ID, Name 
        FROM Test
    END
    

    On C# side, you can access using Reader, datatable, adapter.

    Using adapter has just explained by Susanna Floora.

    Using Reader:

    SqlConnection connection = new SqlConnection(ConnectionString);
    
    command = new SqlCommand("TestProcedure", connection);
    command.CommandType = System.Data.CommandType.StoredProcedure;
    connection.Open();
    SqlDataReader reader = command.ExecuteReader();
    
    List<Test> TestList = new List<Test>();
    Test test = null;
    
    while (reader.Read())
    {
        test = new Test();
        test.ID = int.Parse(reader["ID"].ToString());
        test.Name = reader["Name"].ToString();
        TestList.Add(test);
    }
    
    gvGrid.DataSource = TestList;
    gvGrid.DataBind();
    

    Using dataTable:

    SqlConnection connection = new SqlConnection(ConnectionString);
    
    command = new SqlCommand("TestProcedure", connection);
    command.CommandType = System.Data.CommandType.StoredProcedure;
    connection.Open();
    
    DataTable dt = new DataTable();
    
    dt.Load(command.ExecuteReader());
    gvGrid.DataSource = dt;
    gvGrid.DataBind();
    

    I hope it will help you. :)

    0 讨论(0)
  • 2021-01-01 10:26

    Building on some of the responds here, i'd like to add an alternative way. Creating a generic method using reflection, that can map any Stored Procedure response to a List. That is, a List of any type you wish, as long as the given type contains similarly named members to the Stored Procedure columns in the response. Ideally, i'd probably use Dapper for this - but here goes:

    private static SqlConnection getConnectionString() // Should be gotten from config in secure storage.
            {
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
                builder.DataSource = "it.hurts.when.IP";
                builder.UserID = "someDBUser";
                builder.Password = "someDBPassword";
                builder.InitialCatalog = "someDB";
                return new SqlConnection(builder.ConnectionString);
            }
    
            public static List<T> ExecuteSP<T>(string SPName, List<SqlParameter> Params)
            {
                try
                {
                    DataTable dataTable = new DataTable();
    
                    using (SqlConnection Connection = getConnectionString())
                    {
                        // Open connection
                        Connection.Open();
    
                        // Create command from params / SP
                        SqlCommand cmd = new SqlCommand(SPName, Connection);
    
                        // Add parameters
                        cmd.Parameters.AddRange(Params.ToArray());
                        cmd.CommandType = CommandType.StoredProcedure;
    
                        // Make datatable for conversion
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        da.Fill(dataTable);
                        da.Dispose();
    
                        // Close connection
                        Connection.Close();
                    }
    
                    // Convert to list of T
                    var retVal = ConvertToList<T>(dataTable);
                    return retVal;
                }
                catch (SqlException e)
                {
                    Console.WriteLine("ConvertToList Exception: " + e.ToString());
                    return new List<T>();
                }
            }
    
            /// <summary>
            /// Converts datatable to List<someType> if possible.
            /// </summary>
            public static List<T> ConvertToList<T>(DataTable dt)
            {
                try // Necesarry unfotunately.
                {
                    var columnNames = dt.Columns.Cast<DataColumn>()
                        .Select(c => c.ColumnName)
                        .ToList();
    
                    var properties = typeof(T).GetProperties();
    
                    return dt.AsEnumerable().Select(row =>
                        {
                            var objT = Activator.CreateInstance<T>();
    
                            foreach (var pro in properties)
                            {
                                if (columnNames.Contains(pro.Name))
                                {
                                    if (row[pro.Name].GetType() == typeof(System.DBNull)) pro.SetValue(objT, null, null);
                                    else pro.SetValue(objT, row[pro.Name], null);
                                }
                            }
    
                            return objT;
                        }).ToList();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Failed to write data to list. Often this occurs due to type errors (DBNull, nullables), changes in SP's used or wrongly formatted SP output.");
                    Console.WriteLine("ConvertToList Exception: " + e.ToString());
                    return new List<T>();
                }
            }
    

    Gist: https://gist.github.com/Big-al/4c1ff3ed87b88570f8f6b62ee2216f9f

    0 讨论(0)
  • 2021-01-01 10:27
    // GET: api/GetStudent
    
    public Response Get() {
        return StoredProcedure.GetStudent();
    }
    
    public static Response GetStudent() {
        using (var db = new dal()) {
            var student = db.Database.SqlQuery<GetStudentVm>("GetStudent").ToList();
            return new Response {
                Sucess = true,
                Message = student.Count() + " Student found",
                Data = student
            };
        }
    }
    
    0 讨论(0)
  • 2021-01-01 10:28
     SqlConnection connection = new SqlConnection(ConnectionString);
    
     command = new SqlCommand("TestProcedure", connection);
     command.CommandType = System.Data.CommandType.StoredProcedure;
    
     connection.Open();
    
     DataTable dt = new DataTable();
    
     dt.Load(command.ExecuteReader());
    
     gvGrid.DataSource = dt;
     gvGrid.DataBind();
    
    0 讨论(0)
提交回复
热议问题