Laden...

DataTable an MSSQL übergeben

Erstellt von mrennen vor 11 Jahren Letzter Beitrag vor 11 Jahren 797 Views
M
mrennen Themenstarter:in
166 Beiträge seit 2008
vor 11 Jahren
DataTable an MSSQL übergeben

verwendetes Datenbanksystem: MSSQL 2008 R2

Hallo zusammen,

in aktuellen Programmen von meiner Umgebung existiert die Möglichkeit sich über Mehrfachselektierung in Grids abhängige Daten in einem anderen Grid anzeigen zu lassen.

Hierfür nutze ich aktuell folgenden Code:


                var exp = "app";
                var where = new StringBuilder();

                if (gvData.SelectedRowsCount != 0)
                {
                    where.AppendFormat("{0}l_guid IN (", exp);

                    Parallel.ForEach(gvData.GetSelectedRows(), row => @where.AppendFormat("'{0}', ", GuidHelper.VerifyGuid(gvData.GetRowCellValue(row, gvData.Columns[String.Format("{0}_guid", exp)]))));

                    where.Remove(where.Length - 2, 2);
                    where.Append(")");

Hierbei wird ein String zusammengesetzt welchen ich als Parameter an MSSQL übergebe was auch sehr gut funktioniert.

Leider kommt es ab einer bestimmten Länge von gewählten Datensätzen zu einem Fehler da der erstellte String einfach zu lang wird.

Jetzt habe ich den Ansatz stattdessen ein DataTable mit den Werten zu generieren und dieses direkt an den SQL Server (eine PROCEDURE) zu übergeben.

Also folgende PROCEDURE zu erstellen:


CREATE PROCEDURE [dbo].[appl_log]
AS 
BEGIN
DECLARE @app_table TABLE 
(
	g UNIQUEIDENTIFIER NOT NULL
)

SELECT * FROM [appl_log] WHERE appl_guid IN (SELECT g FROM @app_table)
END

Folgende Fragen habe ich nun:

  • Wie rufe ich die PROCEDURE von C# auf (Rückgabewert DataTable) ?
  • Ist meine SELECT Anweisung richtig ?
F
10.010 Beiträge seit 2004
vor 11 Jahren

http://www.codeproject.com/Tips/214492/Passing-a-datatable-to-a-stored-procedure-in-Sql-S

Es wundert mich schon das dir dein Parallel.Forech mit dem zugriff auf UI Elemente nicht "um die Ohren" fliegt.

F
115 Beiträge seit 2012
vor 11 Jahren

Hi,

ich tät 'nen Join nehmen, da der dem db-System mehr Spielraum beim Zugriffspfad lässt und große in-Listen of lahm werden:

SELECT * 
  FROM [appl_log]
  JOIN [app_table]
ON appl_guid = g

Außerdem ist SELECT * nachteilig weil1.neue Spalten je nach verwendeter Porgrammierung Probleme bereiten 1.evtl. Daten aus der DB gelesen weren, die das Programm gar nicht braucht 1.das DB-System schlechtere Chancen hat den Zugriff "INDEX only" zu gestalten.

Punkt 2 und 3 können erhebliche Auswirkung auf die Ausführungszeti des SQL haben.

Gruß
f_igy