【问题标题】:Best way to update the value of a "list" of variables in a SQL table更新 SQL 表中变量“列表”值的最佳方法
【发布时间】:2016-07-08 00:33:26
【问题描述】:

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

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

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

等等。 (一百多个)

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

名称 (nvarchar 255) |值(位)

变量名称1 |是的

变量名称2 |假的

变量名称3 |是的

等等

我的问题是,如果我想用 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 多个布尔变量,它的执行速度非常慢(每秒 3 次)。我正在考虑使用数据表或 iEnumerable 列表,但我不确定我应该怎么做,我真的是 C# 和 SQL 的新手。

//已编辑,关于 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 不存在,我不知道为什么,出现以下错误:error CS0117: System.Data.SqlDbType' does not contain a definition forStructured'。 我正在使用 Monodevelop 5.9.6 在 Unity3D 中编写代码。

【问题讨论】:

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


    【解决方案1】:

    您可以尝试其中一种。

    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

    【讨论】:

    • 非常感谢,我去试试表值参数!
    • 我一直在使用 TVP 解决解决方案,但我无法正确解决。我编辑了我的问题以添加我的新查询。如果你能看看他们,我将非常感激,谢谢!
    • 抱歉耽搁了。确定你现在已经解决了,如果没有,你能检查一下你使用的 .net 版本吗?不确定,但我认为它不存在于 .net 4.0 之前的版本中,来自 msdn 文档下方。 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2013-06-07
    • 2010-09-26
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多