请教高手:DataAdapter一次性添加多条数据时出错!

阿干2 2007-08-30 02:25:35
在用DataSet一次性将一个DataTable的数据添加到Access中时,

如果表的字段名没有关键字时,就能成功地添加多条数据.

当字段有关键DateTime时出错,不能将数据添加到数据中,

请问有没有好的解决方法.不想修改数据库的字段(也就是允许字段是关键字)


bool LAT::DatabaseAccess::UpdateToDatabase(DataTable^ soureDataTable,String^ TableName)
{
...
...
DataSet^ dataSet = gcnew DataSet();

DataTable^ dt= soureDataTable->Copy();

dataSet->Tables->Add(dt);

dataAdapter->Update(dataSet,TableName);

dataSet->AcceptChanges();
}
...全文
598 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿干2 2007-08-30
  • 打赏
  • 举报
回复
呵呵,是地啊...
如果实在没办法,只能在生成字段时,判断一下了..不能为关键字..

谢谢..
阿干2 2007-08-30
  • 打赏
  • 举报
回复
要开会去了,等会过来...谢谢各位..
jiatong1981 2007-08-30
  • 打赏
  • 举报
回复
我看 改字段名应该是事半功倍的选择 呵呵

阿干2 2007-08-30
  • 打赏
  • 举报
回复
如果微软在进行数据更新时,自动生成的SQL语句能把字段加上[]方括号就好了.:)
阿干2 2007-08-30
  • 打赏
  • 举报
回复
你说的对,可以自己生成一条条SQL语句,再一条条地插入到数据库中.

可我的数据库及表都是即时生成的,项目根据不同的定义文件,即时生成数据库文件及数据表.

是的!我的更新代码如下:
这个函数的功能是将有数据的数据表添加到数据库中,或许这样的效率会好点吧..

如果是那样的话,还要取出表的每个字段名,但是有个问题,用微软的那个工具取出的字段名不是按照数据表的顺序,而是按字母排序的.这个比较烦,不能使数据和字段一一对应..

bool LAT::DatabaseAccess::UpdateToDatabase(DataTable^ soureDataTable,String^ TableName)
{
String^ sqlStatement = "select * from [" + TableName + "]";
try
{
OleDbDataAdapter^ dataAdapter = gcnew OleDbDataAdapter(sqlStatement,_OleConn);

OleDbCommandBuilder^ oleDbCmdBuilder = gcnew OleDbCommandBuilder(dataAdapter);

DataSet^ dataSet = gcnew DataSet();

DataTable^ dt= soureDataTable->Copy();

dataSet->Tables->Add(dt);

dataSet->Tables[0]->TableName = TableName;

dataAdapter->Update(dataSet,TableName);

dataSet->AcceptChanges();
}
catch(Exception^ ex)
{
LAT::CommonFunction::WriteLogEntry(TraceEventType::Error,"Cannot add one row data to temporary DataTable in memory ("+ex->Message+")");

return false;
}

return true;

}
jiatong1981 2007-08-30
  • 打赏
  • 举报
回复
命名时还是不用保留字的好
jiatong1981 2007-08-30
  • 打赏
  • 举报
回复
我的意思还是要在sql语句里把关键字用[]标示出来

按你的意思 你现在是用的CommandBuilder自动生成的sql吧

可以不要这么用 自己指定sql

例如

private static OleDbDataAdapter CreateCustomerAdapter(
OleDbConnection connection)
{
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
OleDbCommand command;
OleDbParameter parameter;

// Create the SelectCommand.
command = new OleDbCommand("SELECT * FROM dbo.Customers " +
"WHERE Country = ? AND City = ?", connection);

command.Parameters.Add("Country", OleDbType.VarChar, 15);
command.Parameters.Add("City", OleDbType.VarChar, 15);

dataAdapter.SelectCommand = command;

// Create the UpdateCommand.
command = new OleDbCommand(
"UPDATE dbo.Customers SET CustomerID = ?, CompanyName = ? " +
"WHERE CustomerID = ?", connection);

command.Parameters.Add(
"CustomerID", OleDbType.Char, 5, "CustomerID");
command.Parameters.Add(
"CompanyName", OleDbType.VarChar, 40, "CompanyName");

parameter = command.Parameters.Add(
"oldCustomerID", OleDbType.Char, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;

dataAdapter.UpdateCommand = command;

return dataAdapter;
}
阿干2 2007-08-30
  • 打赏
  • 举报
回复

这个不行哦 :(((..

字段名不能为[DateTime]的,不能用方括号..:(
阿干2 2007-08-30
  • 打赏
  • 举报
回复
好的,这个方法不错,我试试,把DateTime改为[DateTime]

看能不能实现,,如果OK了给分..呵呵...
阿干2 2007-08-30
  • 打赏
  • 举报
回复
先谢谢jiatong1981(末日之痕) 给我回复..

DataAdapter.Update方法在内部实现时,如果能把字段加上[DateTime]就好了,这样就字段就可以是关键字了>

微软DataAdapter.Update方法在实现时,也是生成SQL语句来实现更新数据库的,因为当有关键字时的异常信息是"Insert 语句错误";

真不是这是不是微软的BUG.
jiatong1981 2007-08-30
  • 打赏
  • 举报
回复
你意思你的字段名就叫DateTime?

那你需要把关键字用[DateTime]来表示
wzq6511 2007-08-30
  • 打赏
  • 举报
回复
ACCESS的Datetime数据类型和SQL server的用法有点区别
阿干2 2007-08-30
  • 打赏
  • 举报
回复
是的有关键字就不能更新,
都有值的,
应该不是数据不匹配的问题,
我用同样的数据,如果把DateTime字段的关键字改为DateTime2就可以添加数据了..
jiatong1981 2007-08-30
  • 打赏
  • 举报
回复
有关键字就不能更新?

确保关键字都有值 不能为空哦

既然能更新 说明代码无误 应该是数据不匹配造成的

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧