大致代码如下:MySqlDataAdapter dadest = new MySqlDataAdapter();//数据适配器DataSet dataset = new DataSet();dadest.SelectCommand = new MySqlCommand("SELECT * FROM " +“tablename”, conn);
dadest.MissingSchemaAction = MissingSchemaAction.AddWithKey;//ExecuteFunction("alter table "+tablename+" AUTO_INCREMENT=1");
//CommandBuilder为自动生成SQL语句,配合DataAdapter使用
MySqlCommandBuilder mysqlcommbuild = new MySqlCommandBuilder(dadest);
dadest.Fill(dataset,“tablename”); //获取表内容填充到数据集中DataRow newrow = dataset.Tables[tablename].NewRow();//目的表中新行newrow["ID"] = 10; //赋值
newrow["name"] = "郁闷";dataset.Tables["tablename"].Rows.Add(newrow); //添加进数据集dadest.Update(dataset,tablename); //提交更新问题是:其中ID列为主键,auto_increment属性。原表中已有五列数据ID:1-5.
如上面所示,我想新添加进ID为10的项,但结果确是ID为6。请大侠们解释并指点下!谢谢
dadest.MissingSchemaAction = MissingSchemaAction.AddWithKey;//ExecuteFunction("alter table "+tablename+" AUTO_INCREMENT=1");
//CommandBuilder为自动生成SQL语句,配合DataAdapter使用
MySqlCommandBuilder mysqlcommbuild = new MySqlCommandBuilder(dadest);
dadest.Fill(dataset,“tablename”); //获取表内容填充到数据集中DataRow newrow = dataset.Tables[tablename].NewRow();//目的表中新行newrow["ID"] = 10; //赋值
newrow["name"] = "郁闷";dataset.Tables["tablename"].Rows.Add(newrow); //添加进数据集dadest.Update(dataset,tablename); //提交更新问题是:其中ID列为主键,auto_increment属性。原表中已有五列数据ID:1-5.
如上面所示,我想新添加进ID为10的项,但结果确是ID为6。请大侠们解释并指点下!谢谢
如上面所示,我想新添加进ID为10的项,但结果确是ID为6。请大侠们解释并指点下!谢谢我问题中已经说明它是自动增长列了,但是我指明了ID插入数据难道系统也忽略???
正如zgke所说的,你可以启用自增列插入的功能
protected void btnBulkCopy_Click(object sender, EventArgs e)
{
String ShajarConString =ConfigurationManager.ConnectionStrings["DSN_Shajar"].ConnectionString;
String NorthWindConString = ConfigurationManager.ConnectionStrings["DSN_Northwind"].ConnectionString;
SqlConnection ShajarCon = new SqlConnection(ShajarConString);
SqlConnection NorthwindCon = new SqlConnection(NorthWindConString);
string sql1 = " SELECT ID, First_Name, Last_Name, " +
" 'Shajar' as Source FROM MailingList_Temp ";
SqlCommand ShajarCom = new SqlCommand(sql1,ShajarCon);
SqlDataReader ShajarReader;
ShajarCon.Open(); SqlBulkCopy NorthWindBulkOp= new SqlBulkCopy(NorthWindConString, SqlBulkCopyOptions.UseInternalTransaction); NorthWindBulkOp.DestinationTableName = "Employees"; NorthWindBulkOp.ColumnMappings.Add("Id", "EmployeeID");
NorthWindBulkOp.ColumnMappings.Add("First_Name", "FirstName");
NorthWindBulkOp.ColumnMappings.Add("Last_Name", "LastName");
SqlBulkCopyColumnMapping JobTitleColMap= new SqlBulkCopyColumnMapping("Source1", "Title");
NorthWindBulkOp.ColumnMappings.Add(JobTitleColMap);
NorthWindBulkOp.BulkCopyTimeout = 500000000; NorthWindBulkOp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied); NorthWindBulkOp.NotifyAfter = 1000; ShajarReader = ShajarCom.ExecuteReader(); try
{
NorthWindBulkOp.WriteToServer(ShajarReader);
}
catch (Exception ex)
{
lblResult.Text = ex.Message;
}
finally
{
ShajarReader.Close();
}
} private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
{
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
}
命令是:set identity_insert 表名 on???
这命令MYSQL中能用吗?怎么提示不存在的命令?
那现在是无法可解了??查看了下似乎有个设置 DataSet.DataTable.Column.Autoincrement=false.有谁熟悉这个设置?
然后将这个缓存(即源表内容)通过DataApdater方式转储到另一个数据库中拥有同样结构的目的表中。
有没有什么好的建议??
我用的是mysql数据库,这东西能用吗?郁闷啊~这问题真解决不了了吗?抽象出来就是如何向DataTable中添加数据,指定的自动增长属性ID不被忽略。
解决办法.
1.调整数据库,修改为非自增长列。
2.如果还是自增长列,那可以在新数据插入到表后,获取新生成的ID数据通过输出参数或返回值反填到对应的DataTable中,维持两者的一致。一般都采用第二种做法。给楼主一些参考。
对于包含自增长的多条数据更新到数据库反填回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没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。
比如当前有3项数据ID为1-3,然后我指定ID为5插入,那么结果应该是有4项数据ID为1,2,3,5.而不会是1,2,3,4 吧?当然如果我不指定ID插入,结果会是1,2,3,4;2.对于上一条的解释应该是yangqidong回复中提到的,用DataAdapter提交数据会忽略ID。3.你提供的解决方案中,第一条当然不会采用,数据库不能随便改。
至于第二条是不是先插入数据提交到数据库中,再即时更新数据库更改的内容到本地的DataTable??
不知道理解的对不对?可是如果这样的话,也不是我想要的。
我仅仅是想能插入指定的ID进数据库,而不是在数据提交的过程中给忽略不管怎样,还是感谢各位的帮忙
自增就是你不用管他,他是自己加的,你赋值也没用
Insert into 时候不用加id这列就ok
我没有说他说的不对~
首先,我问题中已经提到了ID是自动增长列。
其次,我当然知道问题是因为ID自动增长所致!就是贴出来想求教下有没有办法解决这个问题。
再次,我是菜鸟,但是我也不希望看到自己辛苦敲了半天的问题,别人却跟上一句没任何信息量的回复。
最后,我对任何大牛都是崇拜的,但是也有自己的想法。谢谢
只有走过了才知道路通不通,很感谢你的关注与指点。
现在对这个问题做下总结吧:
对于自动增长列:
1.直接使用SQL语句指定插入ID,只要指定ID不与表中已有项ID重复就可插入成功。
2.使用DataAdapter数据适配器配合CommondBuilder命令自动编辑器,自动生成的插入语句将忽略指定ID,采用自增长赋值。
3.这个问题我没有找到解决的办法,还是自己动手写插入语句完成的。虽然没有解决,还是感谢各位!结贴了