2016-03-21 6 views
2

Ich habe Zweifel bezüglich der Aktualisierung des Wertes von mehreren Bool-Variablen in eine Tabelle. Meine Struktur ist:Der beste Weg, um den Wert einer "Liste" von Variablen in einer SQL-Tabelle zu aktualisieren

In C# Ich habe mehrere Bool Variablen wie

public bool varName1 = false; 
public bool varName2 = false; 
public bool varName3 = false; 

usw. (mehr als hundert)

In SQL Server 2014 habe ich eine Tabelle "DigitalInputs" genannt und Da habe ich die Daten wie folgt:

Name (nvarchar 255) | Wert (Bit)

VarName1 | Wahr

VarName2 | Falsch

VarName3 | Wahre

usw.

Meine Frage ist, wenn ich will Werte in der Tabelle von SQL Server mit Werten von Bool Variablen in C# aktualisieren, die die effizienteste Weg sein würde, es zu tun?

Nun, was war ich mit war:

using (SqlCommand command = new SqlCommand("UPDATE DigitalInputs SET Value = @VALUE WHERE Name = @NAME", connection)) 
{ 

command.Parameters.Add(new SqlParameter("NAME", "varName1")); 
command.Parameters.Add(new SqlParameter("VALUE", varName1.ToString())); 
command.ExecuteNonQuery(); //Execute the non query 
command.Parameters.Clear(); //Clear the parameters to add later new ones 

command.Parameters.Add(new SqlParameter("NAME", "varName2")); 
command.Parameters.Add(new SqlParameter("VALUE", varName2.ToString())); 
command.ExecuteNonQuery(); 
command.Parameters.Clear(); 

usw.

Es fein am Anfang gearbeitet, aber jetzt mit mehr als 100 Bool Variablen, es ist wirklich langsam ausführt (3-mal pro Sekunde). Ich habe darüber nachgedacht, vielleicht eine Datentabelle oder eine iEnumerable-Liste zu verwenden, aber ich bin mir nicht sicher, wie ich das machen soll, ich bin wirklich neu in C# und SQL.

// EDITED, Fragen zu TVP

Ich bin bei der Umsetzung der Datatable-Lösung einige Probleme hat, was ich jetzt habe, ist:

In SQL:

CREATE TYPE dbo.DigitalInputs AS TABLE 
(
Name NVARCHAR(255), 
Value BIT 
) 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE UpdateValue 
(@tableData AS dbo.DigitalInputs READONLY) 
AS 
BEGIN 
    SET NOCOUNT ON 
    UPDATE dbo.DigitalInputs 
    SET dbo.DigitalInputs.Value = @tableData.Value 
    FROM dbo.DigitalInputs 
    INNER JOIN @tableData ON dbo.DigitalInputs.Name = @tableData.Name 
END 

I bin nicht sicher über SQL-Syntax in dieser Prozedur erstellen, ich bin ein wenig verloren mit SQL-Sprache.

Und in C#:

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Value", typeof(bool)); 
dataTable.Rows.Add("varName1", varName1); 
//etc... 

using (SqlCommand command = new SqlCommand("UpdateValue", connection)) 
{ 
command.CommandType = CommandType.StoredProcedure; 
SqlParameter parameter = new SqlParameter("@tableData", dataTable); 
parameter.SqlDbType = SqlDbType.Structured; 
command.Parameters.Add(parameter); 
} 

Es scheint, wie SqlDbType.Structured nicht existiert, und ich weiß nicht, warum, ich habe die folgende Fehlermeldung: Fehler CS0117: System.Data.SqlDbType' does not contain a definition for ‚strukturiert. Ich schreibe den Code in Unity3D, mit Monodevelop 5.9.6.

Antwort

3

Sie können einen von diesen versuchen.

1) Tabelle Wert Parameter

Haben Sie einen Blick auf die folgende Antwort und Links in ihm.

How to pass table value parameters to stored procedure from .net code

2) Passing Eingänge als XML-

ein XElement aus der Ids erstellen. Wenn Sie denselben Ansatz verwenden, übergeben Sie stattdessen XElement. Sehen Sie sich dann den folgenden Link an, um Beispiele für die Verwendung des XML in SQL zu erhalten.

https://msdn.microsoft.com/en-IN/library/ms187897.aspx

+0

Vielen Dank, bin ich werde versuchen Parameter Tabellenwert! – MetalxBeat

+0

Ich habe mit TVP an der Lösung gearbeitet, aber ich kann es nicht richtig machen. Ich habe meine Frage bearbeitet, um meine neuen Anfragen hinzuzufügen. Wenn du sie dir ansehen kannst, bin ich sehr dankbar, danke! – MetalxBeat

+0

Entschuldigung für die Verzögerung. Sind Sie sicher, dass Sie es bis jetzt gelöst hätten, wenn nicht, können Sie die von Ihnen verwendete .net-Version überprüfen? Nicht sicher, aber ich glaube nicht, dass es in der Version vor .net 4.0, von unten msdn Dokumentation vorhanden war. https://msdn.microsoft.com/en-us/library/system.data.sqldbtype(v=vs.90).aspx – touchofevil

Verwandte Themen