SQL C# 中的参数化,使用 SQL 声明的变量

SQL paramaterisation in C#, using SQL declared variables

我有以下 SQL 从 C# 程序发送的查询:

DECLARE @id as int
SELECT @id = max(fault_catagory_ident) FROM fault_catagory_list
INSERT INTO fault_catagory_list (fault_catagory_ident, fault_catagory)
VALUES (@id + 1, 'TEST')
SELECT @id + 1

'fault_catagory' 值来自我的程序,但标识值需要是数据库中现有 table 行(主键)中的下一个数字。我的 C# 代码是安全参数化值。

我有两个问题:

  1. 如何将 @id + 1 值 return 编辑到我的程序中(executeNonQuery 没有 return 任何东西)?
  2. 如何获取@id 作为插入命令的参数化值?

我想知道我的主键是否可以通过某种方式实现自动化?

我想在一个查询中执行所有这些操作,因为存在多次登录 运行 同一查询的风险。如果 运行 同时发生任何事情,@id 值可能会重复并且一个会失败。

抱歉,如果这里没有足够的信息,我正在学习!

如有任何建议,我们将不胜感激。提前致谢。

虽然我不同意您为插入的行选择标识行值的逻辑,但您当然可以在 SQL [=20] 中使用 IDENTITY() 列属性来实现=] 定义.

如果您的 SQL 命令中有多个 SELECT, 每次你的 sql 命令中有一个 SELECT 时,一个新的 table 被添加到传入的数据集到数据适配器。

string sql = "
   DECLARE @id as int
   SELECT @id = max(fault_catagory_ident) FROM fault_catagory_list
   INSERT INTO fault_catagory_list (fault_catagory_ident, fault_catagory)
   VALUES (@id + 1, 'TEST')
   SELECT @id + 1";
SqlCommand cmd = new SqlCommand(sql, conn); // assuming you already set connection
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();

da.Fill(ds);

Console.WriteLine( ds.Tables[0].Rows[0][0]);  // this will print @id
Console.WriteLine( ds.Tables[1].Rows[0][0]);  // this will print @id + 1

我想您会在 MSDN 提供的这个示例中找到所需的一切: https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executescalar?view=dotnet-plat-ext-5.0

简而言之:

  1. 到 return 来自查询的单个参数将使用 ExecuteScalar()
  2. 参数通过 System.Data.SqlClient 中提供的 SqlCommand class 添加到查询中。

干杯!

感谢您的建议,我想我已经找到了解决方案... 首先,我需要使用 IDENTITY 约束重新创建带有主键列的 table(现在使用它很有意义,我知道它存在!)。在这里找到了指南(尽管这意味着需要重建 primary/foreign 关键链接)https://www.datameer.com/blog/how-to-add-an-identity-to-an-existing-column-in-sql/

然后在C#程序中,使用SqlCommand.executeScalar到return标识值

Int identReturn = 0;
identReturn = (Int32)cmd.ExecuteScalar();

再次感谢您的回复。