数据库更新操作失败,提交事务被回滚。希望高人指点

supper3000 2004-10-28 09:17:33
这是一个模仿pet shop做的winform程序,数据接口层代码如下
public string Insert(switch3 s3)
{
SqlParameter[] switch3Parms = GetSwitch3ParametersInsert();
SetSwitch3ParametersInsert(switch3Parms, s3);
using (SqlConnection conn = new SqlConnection(SQLHelper.CONN_STRING_NON_DTC))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
try
{

SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_SWITCH3, switch3Parms);
trans.Commit();
return "ok";
}
catch
{
trans.Rollback();
return "failed";
}

}
}

}
private static SqlParameter[] GetSwitch3ParametersInsert()
{
SqlParameter[] parms = SQLHelper.GetCachedParameters(SQL_INSERT_SWITCH3);

if (parms == null)
{
parms = new SqlParameter[] {
//new SqlParameter(PARM_ID3, SqlDbType.Int,4),
new SqlParameter(PARM_SWITCHTYPE, SqlDbType.VarChar, 50),
new SqlParameter(PARM_LOCATION, SqlDbType.VarChar, 50),
new SqlParameter(PARM_IPADDRESS, SqlDbType.VarChar, 50),
new SqlParameter(PARM_OFFICEID, SqlDbType.Int,4),
new SqlParameter(PARM_SLOTCOUNT, SqlDbType.Int, 4),
new SqlParameter(PARM_INPUTPERSON,SqlDbType.VarChar,50),
new SqlParameter(PARM_INPUTPERSON,SqlDbType.SmallDateTime,4),
};

SQLHelper.CacheParameters(SQL_INSERT_SWITCH3, parms);
}

return parms;
}
private void SetSwitch3ParametersInsert(SqlParameter[] parms,switch3 s3)
{
parms[0].Value =s3.switchtype;
parms[1].Value =s3.location;
parms[2].Value =s3.ipaddress;
parms[3].Value =s3.officeid;
parms[4].Value =s3.slotcount;
parms[5].Value=s3.inputperson;
parms[6].Value=s3.inputtime;
}
实体层代码如下:
private int _id3;//3层id
private string _location;//设备位置
private string _switchtype;//交换机类型
private string _ipaddress;//IP地址
private int _officeid;//局Id
private int _slotcount;//槽位数量
private string _inputperson;//录入人
private DateTime _inputtime;//录入时间

public switch3()
{
//
// TODO: 在此处添加构造函数逻辑
//如果不给予参数,则建构的时候给予一个初始化变量
//这么做是为了查询的时候好知道那些东西是给赋值过的,而那些没有
_id3=0;
_officeid=0;
_slotcount=0;
_location="";
_switchtype="";
_ipaddress="";
_inputtime=new DateTime(1000,1,1);
_inputperson="";
}

/// <summary>
/// 这里重载构造函数,如果用户需要在建立一个对象的时候就给它所有属性赋值则使用这个构造函数
/// </summary>
/// <param name="id3">3层id</param>
/// <param name="location">物理位置</param>
/// <param name="switchtype">交换机类型</param>
/// <param name="ipaddress">ip地址</param>
/// <param name="officeid">局id</param>
/// <param name="slotcount">槽位数量</param>
public switch3(int id3,string location,string switchtype,string ipaddress,int officeid,int slotcount,string inputperson,DateTime inputtime)
{
this._id3=id3;
this._location=location;
this._ipaddress=ipaddress;
this._switchtype=switchtype;
this._officeid=officeid;
this._slotcount=slotcount;
this._inputperson=inputperson;
this._inputtime=inputtime;
}
//下面开始设置属性
public int id3
{
get { return _id3; }
set { _id3=value;}
}
public string location
{
get { return _location;}
set { _location=value;}
}
public string switchtype
{
get { return _switchtype;}
set { _switchtype=value;}
}
public string ipaddress
{
get { return _ipaddress;}
set { _ipaddress=value;}
}
public int officeid
{
get { return _officeid;}
set { _officeid=value;}
}
public int slotcount
{
get { return _slotcount;}
set { _slotcount=value;}
}
public string inputperson
{
get { return _inputperson;}
set {_inputperson=value;}
}
public DateTime inputtime
{
get { return _inputtime;}
set {_inputtime=value;}
}
sqlhelper里的sql语句代码如下:
public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {

SqlCommand cmd = new SqlCommand();

using (SqlConnection conn = new SqlConnection(connString)) {
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {

if (conn.State != ConnectionState.Open)
conn.Open();

cmd.Connection = conn;
cmd.CommandText = cmdText;

if (trans != null)
cmd.Transaction = trans;

cmd.CommandType = cmdType;

if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
下面的sqlhelper是微软提供的库,应该没有问题,请高人看看吧,已经忙了几天了,我的qq是12572250随时在线。等待救援
...全文
385 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinbingg 2004-10-29
  • 打赏
  • 举报
回复
这个类应该是没有问题。。要不然也不能叫公共模块。。可能是调用的问题。有些资源没有释放。。在检查你的程序。。你要是改里这个模块的东西。可能这么问题你解决但是其它的问题也会出来的。。
哈哈007哈 2004-10-29
  • 打赏
  • 举报
回复
失败回滚的那个方法没有问题
tongcheng 2004-10-29
  • 打赏
  • 举报
回复
长!
缩小范围。。。
Uncommon 2004-10-29
  • 打赏
  • 举报
回复
密切关注中
Developer2005 2004-10-29
  • 打赏
  • 举报
回复
请问楼主:
===========================================
能否给一段 交换机原始数据的处理代码
爱立信、诺基亚的都可以
譬如将一个数据包写入数据库的方法代码

若可以,请给我留短消息或回复
我将另开帖200分相送
==============================================
fellowcheng 2004-10-28
  • 打赏
  • 举报
回复
up
wangxt 2004-10-28
  • 打赏
  • 举报
回复
太长了,先顶一下再看
xiaohutushen 2004-10-28
  • 打赏
  • 举报
回复
up
lglesias 2004-10-28
  • 打赏
  • 举报
回复
up
shuker 2004-10-28
  • 打赏
  • 举报
回复
try
{

SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_SWITCH3, switch3Parms);
trans.Commit();
return "ok";
}
catch (Exception e)///////加这句,然后跟踪一下看看异常消息是什么,然后贴出来看看
{
trans.Rollback();
return "failed";
}
happyjun2000 2004-10-28
  • 打赏
  • 举报
回复
对于这种很长的代码处理就是要分解来调试查找错误,你首先要保证你的其他函数的单元测试是没有错误的,建议先把逻辑简单化,测试有没有通过,sql语句在查询分析器中先测试看有没有错误。

110,567

社区成员

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

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

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