2016-03-21 14 views
2

Birkaç boole değişkeninin değerinin bir tabloya güncellenmesiyle ilgili şüphelerim var. Benim yapısı şöyledir:SQL tablosundaki değişkenlerin "listesinin" değerini güncellemenin en iyi yolu

C#

, ben

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

(Yüzden fazla)

SQL Server 2014'te

, bir tablo "DigitalInputs" olarak adlandırılan ve benzeri birçok bool değişken var Orada aşağıdaki gibi verilerim var:

Ad (nvarchar 255) | Değer (bit)

VarName1 | True

VarName2 | Yanlış

VarName3 | Gerçek

vb

Sorum şu, bunu yapmak için en etkili yolu olacaktır C# bool değerlerden oluşan değerlerle sql sunucusunun tablosundaki değerleri, güncellemek istiyorsanız? Ben kullanıyordum Şimdi ne olacak

oldu:

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

vb başında ince ama şimdi 100'den fazla bool değerlerden ile çalıştı

, gerçekten yavaş yavaş (3 kez saniyede) çalıştırır. Belki bir veri tablosu veya iEnumerable bir liste kullanmayı düşünüyordum ama nasıl yapmalıyım emin değilim, C# ve SQL'de gerçekten yeniyim.

TVP

Ben uygulayan DataTable çözümde bazı sorunlar yaşıyorum ilişkin sorular, ne şu an sahip olduğu, DÜZENLENECEK //:

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: SQL

Bu yordamın oluşturulmasında SQL sözdizimi hakkında emin değilim, SQL dili ile biraz kayboldum. hata CS0117:

Ve C#

: System.Data.SqlDbType' does not contain a definition for Yapılandırılmış' SqlDbType.Structured yok ve neden ben aşağıdaki hata var bilmiyormuşum gibi

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

görünüyor. Monodevelop 5.9.6'yı kullanarak Unity3D'deki kodu yazıyorum.

cevap

3

Bunlardan birini deneyebilirsiniz.

1) Tablo Değeri Parametreler

aşağıdaki cevap ve içindeki bağlantılara bakın.Bir XML

olarak

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

2) Geçiş giriş kimlikleri bir XElement oluşturun. Aynı yaklaşımı kullanarak XElement'i geçirin. Ve sonra SQL'de XML'in nasıl kullanılacağına dair örnekler için aşağıdaki linke bakınız.

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

+0

Çok teşekkür ederim, deneyeceğim tablo değeri parametreleri değilim! – MetalxBeat

+0

Çözümün etrafında TVP ile çalışıyorum ama doğru anlayamıyorum. Yeni sorularımı eklemek için sorumu düzenledim. Onlara bir göz atabilirseniz çok minnettar olacağım, teşekkürler! – MetalxBeat

+0

Gecikme için özür dilerim. Şimdiye kadar çözdüğünüzden emin misiniz, yoksa, kullandığınız .net sürümünü kontrol edebilir misiniz? Emin değilim ama msdn belgelerinden, .net 4.0 öncesi sürümünde mevcut olduğunu sanmıyorum. https://msdn.microsoft.com/en-us/library/system.data.sqldbtype(v=vs.90).aspx – touchofevil

İlgili konular