如题,C#对ACESS数据库操作,
想加入一条记录:INSERT INTO test (name,dept) VALUES('abc','cba'),然后获得这得记录的主键ID,如何写代码,100分,要从头到尾的代码,没办法,太菜了点,呵呵。从这里开始:
OleDbConnection conn= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + Server.MapPath("data/AddUnit.mdb"));
想加入一条记录:INSERT INTO test (name,dept) VALUES('abc','cba'),然后获得这得记录的主键ID,如何写代码,100分,要从头到尾的代码,没办法,太菜了点,呵呵。从这里开始:
OleDbConnection conn= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + Server.MapPath("data/AddUnit.mdb"));
解决方案 »
- 求助:在多线程中事务处理的迷惑
- 不知道在哪问,放在这里吧~关于虚拟机上安装debian系统
- List<string>问题
- 求这个时间取整怎么写?
- BindingSource的DataMember设为关系时,BindingSource.List转化成DataView出错?
- C#+ACCESS如何实现多表JOIN查询?
- 小问题上遇大麻烦,急啊~~
- 诸位高手,我想问问.net平台下有没有专业的测试软件?最好是专门测试b/s架构的。
- 控件的HelpKeyword属性如果设为中文,当调出CHM文件时显示为乱码?
- 如何在程序中用winrar压缩一批文件和目录,然后解压呢
- 请问:在.net中如何实现模板选择
- 在VC#中如何禁止除0-9的键盘输入呢
SqlCommand cmd = new SqlCommand("Select top ID from test Order by id desc",cn);
int iID = Convert.ToInt32(cmd.ExecuteScalar());
oc.Connection=conn;
oc.CommandText="INSERT INTO test (name,dept) VALUES('abc','cba') SELECT @@identity"
int id=(int)oc.ExecuteScalar();
DataSet ds=new DataSet();
string str="INSERT INTO"
OleDbCommand command=new OleDbCommand(str,conn);
command.CommandType = CommandType.Text;
OleDbDataAdapter dp=new OleDbDataAdapter();
dp.InsertCommand=command;
command=new OleDbCommand("SELECT @@IDENTITY",conn);
dp.SelectCommand=command;
conn.Open();
dp.Fill(ds);
dp.Update(ds);
这是我写的,好象不是这样的吧?!
using (OleDbConnection conn = new OleDbConnection("连接串"))
{
OleDbCommand cmd = new OleDbCommand("SQL语句", conn);
conn.Open();
return (int)cmd.ExecuteScalar();
}
不需要你自己close了.也不用什么DataSet,OleDbDataAdapter 浪费.....
====================
对于包含自增长的多条数据更新到数据库反填回DataTable这个问题可以这样来解决,
DataColumn dc = dt.Columns["id"];//这一列对应的数据库中的表字段是自增列,
在内存DataTable中进行批输入更新时不能马上得到新输入的上一条记录的主键,
所以建立临时唯一主键如下:
dc.AutoIncrement = true;//设置该列为自增长,
dc.AutoIncrementSeed = -1;//新增列的初始值。
dc.AutoIncrementStep = -1;//列的值自动递增的数值。默认为 1。
这样你添加第一条新增数据的时候临时主键为-1,
第二条为-2,
...
在使用DataAdapter.Update(dt);进行更新的时候,
如果数据源是Sql Server那使用存储过程输出参数把自增主键输出会自动更新新增的DataRow,
比如上面的-1,-2,-3等自动会更新成实际数据库中的自增主键值。
这种方式具体可以看我的一片文章,
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
如果是Access或其他数据库就有点麻烦,回填实现如下:
注册DataAdapter.RowUpdated事件。
da.RowUpdated += new OleDbRowUpdatedEventHandler(da_RowUpdated);
事件处理程序,
private static void da_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
if(e.Status == UpdateStatus.Continue && e.StatementType = StatementType.Insert)
{
OleDbConnection conn = new OleDbConnection("连接字符串");
OleDbCommand comm = new OleDbCommand("SELECT @@IDENTITY",conn);
conn.Open();
e.Row["id"] = (int)comm.ExecuteScalar();//得到最新递增值更新到内存DataTable中刚更新的DataRow.
e.Row.AcceptChanges();
conn.Close();
}
}
//处理程序中的每次生成conn,和comm没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。
Select @@Identity
执行后用DataReader读取就可以了。
insert into tablename(fields……) values(values……)
Select @@Identity
";
然后用DataReader读取就可以了。