wake-up-neo.com

Ergebnis aus Auswahlabfrage in gespeicherter Prozedur an eine Liste zurückgeben

Ich schreibe eine gespeicherte Prozedur, die derzeit nur eine SELECT-Abfrage enthält. Es wird erweitert, um einige andere Dinge zu tun, weshalb es eine gespeicherte Prozedur sein muss, aber im Moment ist es eine einfache Abfrage. 

Etwas wie das:

SELECT name, occupation, position 
FROM jobs 
WHERE ...

Ich freue mich darauf, die Ergebnisse dieser Abfrage zur Verwendung in C # zurückzugeben. Ich möchte es einer Liste hinzufügen, damit ich es an eine GridView-Komponente binden kann. 

Ich weiß nicht, wie ich das anstellen soll. Wenn ich sie in eine Liste einfügen muss, nachdem alle ausgewählten Daten zurückgegeben wurden, ist das in Ordnung. Ich muss nur wissen, wie die Daten ordnungsgemäß zurückgegeben werden, damit ich das tun kann. 

Wenn ich es in einem Format zurückgeben kann, das direkt in eine Liste kopiert werden kann, wäre das ideal.

25
muttley91

In einer gespeicherten Prozedur müssen Sie die Auswahlabfrage nur wie folgt schreiben:

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

Auf der C # -Seite können Sie mit Reader, datatable, adapter zugreifen.

Die Verwendung des Adapters wurde gerade von Susanna Floora erklärt.

Reader verwenden:

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();

Datentabelle verwenden:

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();

Ich hoffe es hilft dir. :)

34
Hitesh
 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();
3
Vinay Kumrawat
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();
2
Susanna Floora

Aufbauend auf einigen der Antworten hier möchte ich einen alternativen Weg hinzufügen. Erstellen einer generischen Methode unter Verwendung von Reflection, mit der jede gespeicherte Prozedur einer Liste zugeordnet werden kann. Dies ist eine Liste eines beliebigen Typs, sofern der angegebene Typ Elemente mit ähnlichen Namen wie die Spalten der gespeicherten Prozedur in der Antwort enthält. Idealerweise würde ich dafür wahrscheinlich Dapper verwenden - aber hier ist es:

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>();
            }
        }

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

Ich hatte die gleiche Frage und brauchte eine Ewigkeit, um eine einfache Lösung zu finden.

Verwenden von ASP.NET MVC 5 und EF 6:

Wenn Sie Ihrem .edmx-Modell eine gespeicherte Prozedur hinzufügen, wird das Ergebnis der gespeicherten Prozedur über ein automatisch generiertes Objekt namens yourStoredProcName_result übermittelt.

Dieses _result-Objekt enthält die Attribute, die den Spalten in der Datenbank entsprechen, die Ihre gespeicherte Prozedur ausgewählt hat.

Die _result-Klasse kann einfach in eine Liste konvertiert werden:

yourStoredProcName_result.ToList()
0
Shane

Parameter erhalten?

        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
Anthony Griggs
// 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
sachin