更新SQL表中变量“列表”值的最佳方法

时间:2016-03-21 13:16:01

标签: c# sql sql-server-2008 sql-update

我对将几个bool变量的值更新到表中有疑问。我的结构是:

在C#中,我有几个bool变量,如

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

等。 (超过一百)

在SQL Server 2014中,我有一个名为“DigitalInputs”的表,我的数据如下:

名称(nvarchar 255)|价值(位)

VarName1 |真

VarName2 |假

VarName3 |真

我的问题是,如果我想用C#中的bool变量值更新sql server表中的值,这将是最有效的方法吗?

现在我使用的是:

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

它在开始时工作正常但现在有超过100个bool变量,它执行得非常慢(每秒3次)。我正在考虑使用数据表或iEnumerable列表,但我不知道应该怎么做,我是C#和SQL的新手。

// EDITED,关于TVP的问题

我在实现DataTable解决方案时遇到了一些问题,我现在所拥有的是:

在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

我不确定这个过程创建中的SQL语法,我对SQL语言有点迷失。

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

似乎SqlDbType.Structured不存在而且我不知道为什么,我有以下错误:错误CS0117:System.Data.SqlDbType' does not contain a definition for结构化'。 我正在使用Monodevelop 5.9.6在Unity3D中编写代码。

1 个答案:

答案 0 :(得分:3)

你可以尝试其中一种。

1)表值参数

查看以下答案及其中的链接。

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

2)将输入作为XML传递

从ID创建一个XElement。使用相同的方法传递XElement。然后查看下面的链接,了解如何在SQL中使用XML。

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