请微软件专家,能帮忙解决ADO.NET这个问题!!!急啊!!!

henryfan1 2002-08-25 04:01:04
public bool AddOrderData(ref string TableName,string[] Values,ListView.ListViewItemCollection _Items)
{
OleDbCommand _Command=new OleDbCommand();
OleDbTransaction myTrans;
string _Key;
string SQLString="select ID,OrderDate,UnitPrice,OrderCash from TempOrder where id< 0";
DataSet _DataSet=new DataSet();
try
{
_Connection.Open();
//事务开始
myTrans=_Connection.BeginTransaction();
try
{
OleDbDataAdapter _DataAdapter=new OleDbDataAdapter();
_DataAdapter.SelectCommand=new OleDbCommand(SQLString,_Connection,myTrans);
_DataAdapter.RowUpdated+= new OleDbRowUpdatedEventHandler(OnRowUpdated);
OleDbCommandBuilder _CommandB=new OleDbCommandBuilder(_DataAdapter);
_CommandB.RefreshSchema();
_DataAdapter.Fill(_DataSet,"TempOrder");
DataRow _Row=_DataSet.Tables["TempOrder"].NewRow();
_Row["OrderDate"]=DateTime.Parse(Values[0]);
_Row["UnitPrice"]=Int32.Parse(Values[1]);
_Row["OrderCash"]=Int32.Parse(Values[2]);
_DataSet.Tables["TempOrder"].Rows.Add(_Row);
_DataAdapter.Update(_DataSet,"TempOrder");
_Key=_Row["ID"].ToString();
string TempFields="ID,ComputerNO,StartDate,StartTime";
_Command.Transaction=myTrans;
foreach(ListViewItem tempItem in _Items)
{
SQLString="Inser Into TempOrderComputer(" + TempFields+") Values(";
SQLString+=_Key+","+tempItem.Text+",'"+tempItem.SubItems[1]+"','"+tempItem.SubItems[1]+"')";
_Command.Connection=_Connection;
_Command.CommandText=SQLString;
_Command.ExecuteNonQuery();
}
myTrans.Commit();
}
catch(Exception e_)
{
myTrans.Rollback();
TableName=e_.Message;
return false;
}
//事务结束
_Connection.Close();
}
catch(Exception e_)
{
TableName=e_.Message;
return false;
}
return true;
}
以上代码在执行到_DataAdaPater.update()时错误
“命令必须具有事务对象才能执行,Transaction属性尚未初始化。”
但是事务已经设置了!
不知是不是我做错了,请帮忙解决一下!!急。。。
...全文
52 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
henryfan1 2002-09-01
  • 打赏
  • 举报
回复
各位老兄问题已经解决了。
DATASET是更新时是支持事务的。
我忘了在OnRowUpdated事件的Command中忘了加上事务。
所以有以上的错误。
henryfan1 2002-09-01
  • 打赏
  • 举报
回复
用ACCESS没有存储过程。
dy_2000_abc 2002-08-31
  • 打赏
  • 举报
回复
使用存储过程返回自编号
建立表:
CREATE TABLE [dbo].[abc] ( [id] [int] IDENTITY (1, 1) NOT NULL ,[name] [varchar] (20) NOT NULL
) ON [PRIMARY]
建立存储过程:
CREATE PROCEDURE abc_procedure @name AS VARCHAR(20)AS
INSERT INTO Albums ([name]) VALUES (@name) RETURN @@identity

代码:
SqlConnection sqlConn=new SqlConnection(ConnectionString);
SqlCommand insertCom=new SqlCommand("abc_procedure",sqlConn);
insertCom.CommandType=CommandType.StoredProcedure;
SqlParameter param=insertCom.Parameters.Add("id",SqlDbType.Int);
param.Direction=ParameterDirection.ReturnValue;

param=insertCom.Parameters.Add("@name",SqlDbType.NVarChar);
param.Value="abc";

if (sqlConn.State==ConnectionState.Closed)
this.sqlConnection1.Open();
insertCom.ExecuteNonQuery();
int id=(int)insertCom.Parameters["id"].Value;
bigrongshu 2002-08-26
  • 打赏
  • 举报
回复
你就插入一行,rowID原来就可以得到,何必要放到事务中去;

SqlCommand myCommand = New SqlCommand("select max(ID) from yourTable", myConnection);
_key = CStr(myCommand.ExecuteScalar() + 1);
dejoy 2002-08-26
  • 打赏
  • 举报
回复
太同意bigrongshu(沧海破浪)的了,受益非浅
henryfan1 2002-08-26
  • 打赏
  • 举报
回复
不用DATASET我怎样拿到新建记录的自编号??
我必须拿到自己编号后,才能进行后面的工作!!
sailing_ms 2002-08-26
  • 打赏
  • 举报
回复
感谢您使用微软产品。

根据我的经验,我们需要添加以下两行代码.

...
myTrans=_Connection.BeginTransaction();

_Command.Connection=_Connection; //Added two lines codes
_Command.Transaction=myTrans;

...

从MSDN上我们可以找到以下样本代码:

C#]
public void RunSqlTransaction(string myConnString)
{
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();

SqlCommand myCommand = new SqlCommand();
SqlTransaction myTrans;

// Start a local transaction
myTrans = myConnection.BeginTransaction();
// Must assign both transaction object and connection
// to Command object for a pending local transaction
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;

try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine("Error: {1}", e.Message);
Console.WriteLine("Error reported by {1}.", e.Source);
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}


在从以上代码中,请注意以这句注解:
// Must assign both transaction object and connection
// to Command object for a pending local transaction



更具体的说明和源码请参考下面这些文档:
1. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlConnectionClassTopic.asp

- 微软全球技术中心 技术支持

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
bigrongshu 2002-08-26
  • 打赏
  • 举报
回复
那你就把我上两个帖子的放入事务中

try
{
......
mycommand.ExecuteNonQuery();
.......
_key = CStr(myCommand.ExecuteScalar());
.....

foreach(ListViewItem tempItem in _Items)
{
......
mycommand.ExecuteNonQuery();
}

myTrans.Commit();

}
catch
{
}
池塘边的榕树 2002-08-26
  • 打赏
  • 举报
回复
朋友: 在多用户使用统一自编号的环境中,有一种解决方法,就是读取编号的任务应是一个网络公共的服务(统一管理),并且所有请求都串行化,这样就不会出现你所遇见的问题。
henryfan1 2002-08-26
  • 打赏
  • 举报
回复
没有事务,可以确保,其子记录添加的ID就是MAX(ID)条记录的ID,
要是有人在你执行这条命令前又添加记录。
种情况应该有吧。
更何况我还要确保父表和子表的记录都要添加成功。
只要任何一个错,也不可能让一个表有记录添加成功。
henryfan1 2002-08-26
  • 打赏
  • 举报
回复
当MYCOMMAND执行后,有人就添加一条新的记录(在多用户使用时,这种情况是存在的)。
那么这个编号还有效吗?
bigrongshu 2002-08-25
  • 打赏
  • 举报
回复
我看了一下你的代码,新建记录为何要使用DataSet呢,

可以直接对数据库进行InsertComand操作

string SQLString="Insert into yourTable(yourField1,yourField2) values (@parameter1,@parameter2)"

将参数值设置为values[0]..values[n],然后ExecuteNonQuery即可

这样就可以放入整体事务操作

henryfan1 2002-08-25
  • 打赏
  • 举报
回复
但是我要把新建记录的自编号拿出来。
然后在其它表新建对应自编号的记录。
整个过程一定要用事务来解决的。
DATASET更新也是用INSERTCOMMAND来进行的。按道理是可行的。
楼上那位老兄,还有什么方法拿取自编号的值。
拿取后还要配合整个事务来操作。
如果用更好的方法,请指较一下小弟。
bigrongshu 2002-08-25
  • 打赏
  • 举报
回复
见http://www.csdn.net/expert/topic/968/968278.xml?temp=.102627
bigrongshu 2002-08-25
  • 打赏
  • 举报
回复
你的以下代码:

_DataAdapter.SelectCommand=new OleDbCommand (SQLString,_Connection,myTrans);

_Command.Transaction=myTrans;

说明事务处理只是和_Command相关,和你的_DataAdapter并没有关系;

所以你执行_DataAdaPater.update()时会出现没有事务对象的错误

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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