[英]SqlDataAdapter Get Identity after insert
在将其填充到Dataset
后,我创建了一个SqlDataAdapter
。 我的问题是,插入后我想获取主列的IDENTITY
值。 例如,在插入后给定 buttonedit1 编辑值是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"]);
}
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;
}
如果您将 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()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.