C# SqlDataAdapter在插入后获取标识

C# SqlDataAdapter在插入后获取标识,c#,sql-server,sqldataadapter,C#,Sql Server,Sqldataadapter,在将其填充到数据集之后,我创建了一个SqlDataAdapter。我的问题是,在insert之后,我想获得主列的IDENTITY值。例如,在插入后,give buttonedit1 editvalue是Id(这是我的主列),我希望在buttonedit1文本中获取标识值 除非使用SQL命令,如Select@IDentity 谢谢 public void Form1_Load(object sender,EventArgs e) { try { SqlConnection

在将其填充到数据集之后,我创建了一个
SqlDataAdapter
。我的问题是,在insert之后,我想获得主列的
IDENTITY
值。例如,在插入后,give buttonedit1 editvalue是
Id
(这是我的主列),我希望在buttonedit1文本中获取标识值

除非使用SQL命令,如
Select@IDentity

谢谢

public void Form1_Load(object sender,EventArgs e)
{
   try
   {
      SqlConnection con = new SqlConnection(@"ConString");

      con.Open();

      adap = new SqlDataAdapter("select Id,Caption from SKMenu where ID=-1",con);
      adap.Fill(ds, "Table");

      bs.DataSource = ds.Tables["Table"];

      buttonEdit1.DataBindings.Add("Text", bs, "Id");
      buttonEdit2.DataBindings.Add("Text", bs, "Caption");

      bs.AddNew();
}

private void button1_Click(object sender, EventArgs e)
{
   SqlCommandBuilder cv = new SqlCommandBuilder(adap);            

   bs.EndEdit();

   adap.Update(ds.Tables["Table"]);
}

如果将Adpater上INSERTCOMAND上的命令更改为该命令,则应该可以

INSERT INTO  SKMenu  ( Caption ) VALUES ( @Caption);
SELECT Id, Caption FROM SKMenu WHERE id = SCOPE_IDENITY();
您还可以使用OUTPUT子句

update命令应该类似于

UPDATE  SKMenu  SET Caption = @Caption WHERE ID = @id;
IIRC只要在
adap.Update()

公共静态bool CreateEntity(对象实体,out long id)之后调用
ds.AcceptChanges()
,数据集就足够智能,可以知道何时使用Update或Insert { bool-created=false; long-newid=-1; DataTable=新的DataTable(); 使用(SqlConnection conn=newsqlconnection(Provider.Connection())) { string sqlcreate=“select*from{0},其中id=-1;”; conn.Open(); 使用(SqlDataAdapter da=newsqldataadapter(String.Format(sqlcreate,entity.GetType().underyingsystemtype.Name),conn)) { 使用(SqlCommandBuilder build=newsqlcommandbuilder(da)) { 使用(数据集ds=新数据集()) { da.填充(ds); DataRow dr=ds.Tables[0].NewRow(); 更新(实体,dr); da.InsertCommand=build.GetInsertCommand(); da.InsertCommand.CommandText+=“选择范围_标识()”; da.InsertCommand.Parameters.Clear(); for(int i=1;i
无论如何,您必须调用类似
SELECT SCOPE\u IDENTITY()
之类的函数,或者在
INSERT
调用中使用
OUTPUT
语句来获取新插入的标识值-实际上没有其他方法。您的代码也非常不完整-有一个开始
尝试{..
但没有正确的结束(没有结束括号,也没有catch或finally语句块)…谢谢您的回答,但如果我更新一行两次,或者它不是insert,它就是update。它会一直更新到我的新ID。这对我来说很有效。由于SCOPE_IDENTITY()返回object(var),我使用它,因为我使用的表有int-IDENTITY字段:sqlDataAdapter.InsertCommand.CommandText+=“选择Convert(int,SCOPE_IDENTITY())”,然后在添加参数后选择:IDENTITY=(int)sqlDataAdapter.InsertCommand.ExecuteScalar();(正在正确格式化此文件;四个空格和Ctrl-K无效。)
    public static bool CreateEntity(object entity, out long id)
    {
        bool created = false;
        long newid = -1;

        DataTable table = new DataTable();

        using (SqlConnection conn = new SqlConnection(Provider.Connection()))
        {
            string sqlcreate = "select * from {0} where id = -1;";
            conn.Open();
            using (SqlDataAdapter da = new SqlDataAdapter(String.Format(sqlcreate, entity.GetType().UnderlyingSystemType.Name), conn))
            {

                using (SqlCommandBuilder build = new SqlCommandBuilder(da))
                {
                    using (DataSet ds = new DataSet())
                    {
                        da.Fill(ds);

                        DataRow dr = ds.Tables[0].NewRow();

                        ClassProperties.Update(entity, dr);
                        da.InsertCommand = build.GetInsertCommand();
                        da.InsertCommand.CommandText += ";SELECT SCOPE_IDENTITY()";
                        da.InsertCommand.Parameters.Clear();
                        for (int i = 1; i < dr.ItemArray.Length; i++)
                        {
                            da.InsertCommand.Parameters.AddWithValue("@p" + i, dr.ItemArray[i]);
                        }

                        var result = da.InsertCommand.ExecuteScalar();
                        if (result != null)
                        {
                            created = true;
                            newid = Convert.ToInt64(result);
                        }
                    }
                }
            }
        }

        id = newid;
        return created;
    }