有关C# sql 插入数据 null值处理有关问题
有关C# sql 插入数据 null值处理问题
参数化参数化查询 '(@ccheck nvarchar(4000),@cbook nvarchar(4000),@ibook int,@ccashi' 需要参数 '@dt_date',但未提供该参数。查询 '(@ccheck nvarchar(4000),@cbook nvarchar(4000),@ibook int,@ccashi' 需要参数 '@dt_date',但未提供该参数。
------解决思路----------------------
你直接输入一个固定的值试试,是不是转换的时候 报错了。能给分吗
------解决思路----------------------
strSql.Append("ccheck,cbook,ibook,ccashier,iflag,ctext1,ctext2,cdigest,ccode,cexch_name,……
strSql.Append("@ccheck,@cbook,@ibook,@ccashier,@iflag,@ctext1……
这两句里有参数@dt_date对应的项吗?仔细查查,可以把长代码复制到记事本检查
再检查下,Common.DateToNull(sqlNull(model.dt_date))输出的是不是一个有效的日期类型
------解决思路----------------------
应该是 Common.DateToNull把值转成了Null然后会爆这样的错误。
你已经sqlNull了,为什么还要在转换一次?
另外,还有2个地方
1. cmd.Parameters[0].IsNullable = true;
不知道这句的意义何在。
2. foreach开始或者最后的地方,你不clear下你的cmd.Parameters吗?
------解决思路----------------------
Common.DateToNull(sqlNull(model.dt_date))
写错了顺序,调一下
sqlNull(Common.DateToNull(model.dt_date))
public static object sqlNull(object str)
{
if (str == null || str.ToString().Length <= 0)
{
return DBNull.Value;
}
else
{
return str;
}
}
public static bool RunTrans(StringBuilder sql, List<GL_ACCVOUCH> List_Accvouch)
{
bool runflag = false;//判断折行文件是否执行成功
SqlCommand cmd =DbHelperSQL. Connection.CreateCommand();
SqlTransaction varTrans = DbHelperSQL.Connection.BeginTransaction();
cmd.Transaction = varTrans;
try
{
foreach (GL_ACCVOUCH model in List_Accvouch)
{
cmd.Parameters.AddWithValue("@ccheck", sqlNull(model.ccheck));
cmd.Parameters[0].IsNullable = true;
cmd.Parameters.AddWithValue("@cbook", sqlNull(model.cbook));
cmd.Parameters.AddWithValue("@ibook", sqlNull(model.ibook));
cmd.Parameters.AddWithValue("@ccashier", sqlNull(model.ccashier));
cmd.Parameters.AddWithValue("@iflag", sqlNull(model.iflag));
cmd.Parameters.AddWithValue("@ctext1", sqlNull(model.ctext1));
cmd.Parameters.AddWithValue("@ctext2", sqlNull(model.ctext2));
cmd.Parameters.AddWithValue("@cdigest", sqlNull(model.cdigest));
cmd.Parameters.AddWithValue("@ccode", sqlNull(model.ccode));
cmd.Parameters.AddWithValue("@cexch_name", sqlNull(model.cexch_name));
cmd.Parameters.AddWithValue("@iperiod", sqlNull(model.iperiod));
cmd.Parameters.AddWithValue("@md", sqlNull(model.md));
cmd.Parameters.AddWithValue("@mc", sqlNull(model.mc));
cmd.Parameters.AddWithValue("@md_f", sqlNull(model.md_f));
cmd.Parameters.AddWithValue("@mc_f", sqlNull(model.mc_f));
cmd.Parameters.AddWithValue("@nfrat", sqlNull(model.nfrat));
cmd.Parameters.AddWithValue("@nd_s", sqlNull(model.nd_s));
cmd.Parameters.AddWithValue("@nc_s", sqlNull(model.nc_s));
cmd.Parameters.AddWithValue("@csettle", sqlNull(model.csettle));
cmd.Parameters.AddWithValue("@cn_id", sqlNull(model.cn_id));
cmd.Parameters.AddWithValue("@dt_date", Common.DateToNull(sqlNull(model.dt_date)));
cmd.Parameters.AddWithValue("@csign", sqlNull(model.csign));
cmd.Parameters.AddWithValue("@cdept_id", sqlNull(model.cdept_id));
cmd.Parameters.AddWithValue("@cperson_id", sqlNull(model.cperson_id));
cmd.Parameters.AddWithValue("@ccus_id", sqlNull(model.ccus_id));
cmd.Parameters.AddWithValue("@csup_id", sqlNull(model.csup_id));
cmd.Parameters.AddWithValue("@citem_id", sqlNull(model.citem_id));
cmd.Parameters.AddWithValue("@citem_class", sqlNull(model.citem_class));
。。。。。。。。。。。。
cmd.CommandText = sql.ToString();
cmd.ExecuteNonQuery();
}
varTrans.Commit();
runflag = true;
}
catch (Exception ce)
{
varTrans.Rollback();
throw ce;
}
return runflag;
}
/// <summary>
/// 增加一条数据
/// </summary>
public bool Add_Accvouch(List<GL_ACCVOUCH> AccvouchList)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into GL_ACCVOUCH(");
strSql.Append("ccheck,cbook,ibook,ccashier,iflag,ctext1,ctext2,cdigest,ccode,cexch_name,iperiod,md,mc,md_f,mc_f,nfrat,nd_s,nc_s,csettle,cn_id,dt_date,csign,cdept_id,cperson_id,ccus_id,csup_id,citem_id,citem_class,cname,ccode_equal,iflagbank,iflagPerson,isignseq,bdelete,coutaccset,ioutyear,coutsysname,coutsysver,doutbilldate,ioutperiod,coutsign,coutno_id,doutdate,ino_id,coutbillsign,coutid,bvouchedit,bvouchAddordele,bvouchmoneyhold,bvalueedit,bcodeedit,ccodecontrol,bPCSedit,bDeptedit,inid,bItemedit,bCusSupInput,cDefine1,cDefine2,cDefine3,cDefine4,cDefine5,cDefine6,cDefine7,cDefine8,dbill_date,cDefine9,cDefine10,cDefine11,cDefine12,cDefine13,cDefine14,cDefine15,cDefine16,dReceive,cWLDZFlag,idoc,dWLDZTime,bFlagOut,iBG_OverFlag,cBG_Auditor,dBG_AuditTime,cBG_AuditOpinion,bWH_BgFlag,ssxznum,CErrReason,BG_AuditRemark,cbill,cBudgetBuffer,iBG_ControlResult,NCVouchID,daudit_date,RowGuid,cBankReconNo,cnotetypecode,cnoteno");
strSql.Append(") values (");
strSql.Append("@ccheck,@cbook,@ibook,@ccashier,@iflag,@ctext1,@ctext2,@cdigest,@ccode,@cexch_name,@iperiod,@md,@mc,@md_f,@mc_f,@nfrat,@nd_s,@nc_s,@csettle,@cn_id,@dt_date,@csign,@cdept_id,@cperson_id,@ccus_id,@csup_id,@citem_id,@citem_class,@cname,@ccode_equal,@iflagbank,@iflagPerson,@isignseq,@bdelete,@coutaccset,@ioutyear,@coutsysname,@coutsysver,@doutbilldate,@ioutperiod,@coutsign,@coutno_id,@doutdate,@ino_id,@coutbillsign,@coutid,@bvouchedit,@bvouchAddordele,@bvouchmoneyhold,@bvalueedit,@bcodeedit,@ccodecontrol,@bPCSedit,@bDeptedit,@inid,@bItemedit,@bCusSupInput,@cDefine1,@cDefine2,@cDefine3,@cDefine4,@cDefine5,@cDefine6,@cDefine7,@cDefine8,@dbill_date,@cDefine9,@cDefine10,@cDefine11,@cDefine12,@cDefine13,@cDefine14,@cDefine15,@cDefine16,@dReceive,@cWLDZFlag,@idoc,@dWLDZTime,@bFlagOut,@iBG_OverFlag,@cBG_Auditor,@dBG_AuditTime,@cBG_AuditOpinion,@bWH_BgFlag,@ssxznum,@CErrReason,@BG_AuditRemark,@cbill,@cBudgetBuffer,@iBG_ControlResult,@NCVouchID,@daudit_date,@RowGuid,@cBankReconNo,@cnotetypecode,@cnoteno");
strSql.Append(") ");
bool flag = RunTrans(strSql, AccvouchList);
return flag;
}
参数化参数化查询 '(@ccheck nvarchar(4000),@cbook nvarchar(4000),@ibook int,@ccashi' 需要参数 '@dt_date',但未提供该参数。查询 '(@ccheck nvarchar(4000),@cbook nvarchar(4000),@ibook int,@ccashi' 需要参数 '@dt_date',但未提供该参数。
------解决思路----------------------
你直接输入一个固定的值试试,是不是转换的时候 报错了。能给分吗
------解决思路----------------------
strSql.Append("ccheck,cbook,ibook,ccashier,iflag,ctext1,ctext2,cdigest,ccode,cexch_name,……
strSql.Append("@ccheck,@cbook,@ibook,@ccashier,@iflag,@ctext1……
这两句里有参数@dt_date对应的项吗?仔细查查,可以把长代码复制到记事本检查
再检查下,Common.DateToNull(sqlNull(model.dt_date))输出的是不是一个有效的日期类型
------解决思路----------------------
应该是 Common.DateToNull把值转成了Null然后会爆这样的错误。
你已经sqlNull了,为什么还要在转换一次?
另外,还有2个地方
1. cmd.Parameters[0].IsNullable = true;
不知道这句的意义何在。
2. foreach开始或者最后的地方,你不clear下你的cmd.Parameters吗?
------解决思路----------------------
Common.DateToNull(sqlNull(model.dt_date))
写错了顺序,调一下
sqlNull(Common.DateToNull(model.dt_date))