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

C# C语言中的SQL参数化,使用SQL声明的变量,c#,sql,visual-studio,sql-insert,C#,Sql,Visual Studio,Sql Insert,我从C程序发送以下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 “fault_catogory”值来自我的程序,但ident值必须是数据库中现

我从C程序发送以下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
“fault_catogory”值来自我的程序,但ident值必须是数据库中现有表的主键行中的下一个数字。我的C代码正在为安全性参数化值

我有两个问题:

如何获取返回给程序ExecuteOnQuery的@id+1值?查询不返回任何内容? 如何获取@id作为insert命令的参数化值? 我想知道我的主键是否可以通过某种方式实现自动化

我想在一个查询中完成所有这些,因为运行同一个查询将有多次登录的风险。如果任何一个同时运行,@id值可能会被复制,其中一个将失败

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


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

虽然我不同意为插入的行选择标识行值的逻辑,但在SQL表定义中使用标识列属性肯定可以实现这一点

如果SQL命令中有多个选择, 每次在sql命令中有SELECT时,都会将一个新表添加到传入的数据集中的数据适配器中

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中提供的示例中找到所需的一切:

简言之:

要从查询返回单个参数,请使用ExecuteScalar 参数通过System.Data.SqlClient中提供的SqlCommand类添加到查询中。
干杯

谢谢你的建议,我想我已经找到了解决办法。。。 首先,我需要使用IDENTITY约束重新创建具有主键列的表,现在我知道它存在了!使用它是有意义的!。在这里找到了一个指南,虽然它意味着一些主键/外键链接的重建

然后在C程序中,使用SqlCommand.executeScalar返回标识值

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

再次感谢您的回复。

您正在寻找身份功能永远不要使用此类代码。它保证了重复的值。这也完全没有必要。您可以创建一个带有标识约束的列,使数据库生成唯一的值。您可以轻松地编写一个INSERT并使用OUTPUT子句返回任何生成的值。将标识约束添加到fault_catagory_ident,并使用INSERT INTO fault_catagory_list fault_catagory OUTPUT inserted.fault_catagory_ident VALUES“TEST”检索生成的值,该值不是单个查询,但只有一个结果集。选择@id-…`设置变量,它不返回任何内容。cmd.ExecuteScalar将返回递增的ID。但更大的问题是,此代码将生成重复的值hanks,这肯定有助于返回我想要的值。