插入后SqlDataAdapter获取标识

时间:2011-06-28 20:58:19

标签: c# sql-server sqldataadapter

我将SqlDataAdapter填入Dataset后创建IDENTITY。我的问题是插入后我想得到主列的Id值。例如,在插入后我想获取ButtonEdit1文本中的标识值,给出buttonedit1 editvalue为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"]); }

之类的SQL命令,否则我可以这样做

感谢。

{{1}}

2 个答案:

答案 0 :(得分:2)

    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;
    }

答案 1 :(得分:1)

如果您将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数据集非常智能,只要您在ds.AcceptChanges()之后致电adap.Update(),就知道何时使用更新或插入。