c#如何返回插入行的ID值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何返回插入行的ID值相关的知识,希望对你有一定的参考价值。

数据库data中表person中有id(主键,自动生成),age,name字段,现插入数据,返回插入数据的Id值,而不是返回影响的行数,以下代码返回的是影响的行数,如何修改可以返回插入数据当前行的id值,谢谢!
string str = "Data Source=.;Initial Catalog=data;Integrated Security=True";
SqlConnection conn = new SqlConnection(str);
string sql = "insert into person (Age,Name) output inserted.Id values(20,'name')";
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
int i=cmd.ExecuteNonQuery();
conn.close();
MessageBox.Show(i.ToString());

插入后,SELECT SCOPE_IDENTITY();\\这个是返回你当前插入的ID,只是你个人会话

SELECT IDENT_CURRENT\\这个是返回全局ID值,就是如果有多个用户插入数据,它会返回最后一个自增的ID,

按你的需求,应该用SELECT SCOPE_IDENTITY()
参考技术A int i=cmd.ExecuteNonQuery();
//改为 int i = cmd.ExecuteScalar()
参考技术B int i 要为id值是吗?
ExecuteScalar 执行查询,并返回查询所返回的结果集中第一行的第一列。
ExecuteNonQuery 执行SQL语句并返回受影响的行数
ExecuteReader 执行返回数据集的SELECT语句
你这里是第二种,当然是反回受影响的行数啦!
如果要ID值的,那就需要写一个查询的sql语句:select id from person where name='name'
然后用ExecuteScalar执行查询,返回的自然是id本回答被提问者采纳

如何在从数据库中选择时使用选择值进行 c# 插入

【中文标题】如何在从数据库中选择时使用选择值进行 c# 插入【英文标题】:how to do a c# insert with a select values in a select from database 【发布时间】:2021-12-02 05:29:13 【问题描述】:

我正在尝试让我的选择值进入我的插入但我不知道如何制作这个循环。目前,我的选择返回超过 1 个值。但他只插入第一个。有人可以帮我解决这个循环吗???

            
                string cs = @"Data Source=xxxx";
                SqlConnection cn = new SqlConnection(cs);
                cn.Open();
                Console.WriteLine("established connection");

                string query = @"SELECT a.idfaturamento,
                                       a.id_capa,
                                       a.pagamentodata,
                                       a.mensal,
                                       b.id_status
                                FROM   capas_faturamentos AS a
                                       INNER JOIN capas AS b
                                               ON a.id_capa = b.id_capa
                                WHERE  b.id_status = 4
                                       AND a.mensal = 1
                                       AND Month(a.pagamentodata) != Month(Getdate()) ";

                SqlCommand cmd1 = new SqlCommand(query, cn);
                SqlDataReader r = cmd1.ExecuteReader();

                DateTime pagamentoData = DateTime.Today;
                int id_Capa = 0;
                bool temFaturamentoMensal = false;

                while (r.Read() == true)
                
                    int idFaturamento = r.GetInt32(0);
                    id_Capa = r.GetInt32(1);
                    pagamentoData = r.GetDateTime(2);

                    Console.WriteLine("ID FATURAMENTO: 0\t ID CAPA:1\t DATA:2\t",
                        idFaturamento, id_Capa, pagamentoData);
                    temFaturamentoMensal = true;
                
                cn.Close();

                Console.WriteLine("___________________");

                cn.Open();
                if (temFaturamentoMensal)
                 
                    string query2 = @"insert into capas_faturamentos values ('"+ id_Capa +"','" + pagamentoData.ToString("yyyy/MM/dd") + "', '" + pagamentoData.ToString("yyyy/MM/dd") + "', '" + pagamentoData.ToString("yyyy/MM/dd") + "', '" + pagamentoData.ToString("yyyy/MM/dd") + "', '" + pagamentoData.ToString("yyyy/MM/dd") + "', '" + pagamentoData.ToString("yyyy/MM/dd") + "','0','0','0','0','0','0', NULL, NULL, NULL, NULL, NULL, NULL, '1')";
                    Console.WriteLine(query2);
                    SqlCommand cmd = new SqlCommand(query2, cn);
                    int result = cmd.ExecuteNonQuery();
                    Console.WriteLine(result + " record/s insert in table capas_faturamentos");
                
                cn.Close();```

I need help creating this loop.

【问题讨论】:

使用计数ID然后插入循环内 AND Month(a.pagamentodata) != Month(Getdate()) 明年 10 月,您(或其他人)可能会因为它发生出乎意料的事情而感到不快。 【参考方案1】:

对于您的插入,您不需要循环

只运行

insert into capas_faturamentos 
SELECT 
       a.id_capa,
       a.pagamentodata,
       a.pagamentodata,
       a.pagamentodata,
       a.pagamentodata,
       a.pagamentodata,
       a.pagamentodata,
       '0','0','0','0','0','0', NULL, NULL, NULL, NULL, NULL, NULL, '1'    
FROM   capas_faturamentos AS a
       INNER JOIN capas AS b
               ON a.id_capa = b.id_capa
WHERE  b.id_status = 4
       AND a.mensal = 1
       AND Month(a.pagamentodata) != Month(Getdate()) 

如果您想完全使用循环,请使用准备好的语句,如How do multi rows insert with MySqlCommand and prepare statement?(#C)

【讨论】:

【参考方案2】:

你不需要任何循环。将所有内容放在一个 sql 脚本中

string query = @"
insert into capas_faturamentos 
SELECT a.idfaturamento,
         a.id_capa,
         a.pagamentodata,
           a.pagamentodata,
            a.pagamentodata,
           a.pagamentodata, 
             a.pagamentodata,
           a.pagamentodata, 
            '0','0','0','0','0','0', NULL, NULL, NULL, NULL, NULL, NULL, '1' 
  FROM   capas_faturamentos AS a
         INNER JOIN capas AS b
                 ON a.id_capa = b.id_capa
  WHERE  b.id_status = 4
         AND a.mensal = 1
         AND Month(a.pagamentodata) != Month(Getdate()) ";

和代码

 string cs = @"Data Source=xxxx";
var myConnection = new MySqlConnection(cs);
MySqlCommand myCommand = new MySqlCommand(query, myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();

【讨论】:

以上是关于c#如何返回插入行的ID值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prepared Statement,我如何返回插入行的 id?

Dapper for NET Core:插入表并返回插入行的 id

使用SQLServer2005插入一条数据时返回当前插入数据的ID

如何在 MySQL 中获取多个插入行的 ID?

WebSQL,Phonegap。返回最后插入行的 ID

从 C# 中的插入查询返回 ID