【问题标题】:SqlDataAdapter Get Identity after insertSqlDataAdapter 插入后获取标识
【发布时间】:2011-06-28 20:58:18
【问题描述】:

我创建一个SqlDataAdapter 后将其填充到Dataset。我的问题是插入后我想获得主列的IDENTITY 值。例如给 buttonedit1 的编辑值是 Id (这是我的主要列)插入后我想在 ButtonEdit1 文本中获取标识值。

除非使用像Select @IDentity这样的SQL命令,否则我可以做到这一点

谢谢。

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"]);
}

【问题讨论】:

  • 一种或另一种方式,您必须调用类似SELECT SCOPE_IDENTITY() 或在您的INSERT 调用中使用OUTPUT 语句来获取新插入的标识值 - 有真的,别无他法。
  • 您的代码也很不完整 - 有一个起始 try { .... 但没有适当的结束(没有结束大括号,也没有 catch 或 finally 语句块)......
  • 感谢您的回答,但如果我两次更新一行或者它没有插入它就是更新。所有时间它都会得到我的新 ID

标签: c# sql-server sqldataadapter


【解决方案1】:
    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;
    }

【讨论】:

  • 这对我有用。由于 SCOPE_IDENTITY() 返回对象 (var) 我使用它,因为我使用的表具有 int 标识字段: sqlDataAdapter.InsertCommand.CommandText += ";SELECT Convert(int, SCOPE_IDENTITY())";然后在添加参数后:identity = (int)sqlDataAdapter.InsertCommand.ExecuteScalar(); (努力使这个格式正确;四个空格和 Ctrl-K 不起作用。)
【解决方案2】:

如果您将 Adpater 上的 InsertCommand 上的命令更改为此您应该没问题

INSERT INTO  SKMenu  ( Caption ) VALUES ( @Caption);
SELECT Id, Caption FROM SKMenu WHERE id = SCOPE_IDENITY();

你也可以使用 OUTPUT 子句

更新命令应该是这样的

UPDATE  SKMenu  SET Caption = @Caption WHERE ID = @id;

IIRC 数据集足够聪明,知道何时使用更新或插入,只要您在 adap.Update() 之后调用 ds.AcceptChanges()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多