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.
Vielen Dank, bin ich werde versuchen Parameter Tabellenwert! – MetalxBeat
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
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