求救!! 为什么有时没有获取到DataSet中Table的值?

jiangseraph 2011-05-17 10:05:47
代码如下:

DataSet ds = GetTankDelivery();

int UpdateRecords = ds.Tables[0].Rows.Count;
if (UpdateRecords == 0)

{...}
else
{
string StartID = ds.Tables[0].Rows[0][0].ToString();
long EndID = Int64.Parse(ds.Tables[0].Rows[UpdateRecords - 1][0].ToString());

OnlineWebService.WebService oWebService = new OnlineWebService.WebService();
// Import data to BI
if (oWebService.ProcessTankDelivery(ds))
{
string Result = UpdateTankProductVolumeHistory_Flag(EndID);
if (Result == "Success")
{ ...}
else
{
log.Error("[" + state.ToString() + "]--Update table flag fail, return: " + Result);
}
}
else
{...}
}


这是一个已经正常运行的程序,昨天看到了错误日志,能否请高手们帮我分析下究竟问题出在哪里?
错误日志如下:

ERROR WindowsService.clsSender - [RequestRptTankDips]--Update table flag fail, return: Procedure or function 'usp_eFUEL_UpdateTankProductVolumeHistory_Flag' expects parameter '@intHistory', which was not supplied.
ERROR WindowsService.clsSender - Got exception of {System.ArgumentException: The SqlParameter is already contained by another SqlParameterCollection.
at System.Data.SqlClient.SqlParameterCollection.Validate(Int32 index, Object value)
at System.Data.SqlClient.SqlParameterCollection.Add(Object value)
at System.Data.SqlClient.SqlParameterCollection.Add(SqlParameter value)
at WindowsService.clsSender.runMultiRowSelect(String sqlCommand, List`1 parameters, String srcTable) in ...\\clsSender.cs:line 351} while trying to run method of [RetrieveRequest].

@intHistory就是我传入的EndID,是Identity非空, 我不明白为什么EndID会没有取到值.
我唯一怀疑的是这个字段在源数据库中的类型是int(我还没有去检查数据库设计文档) ,在目标数据库中是bigint,我不确认这是否会在转换中造成问题, 请高手帮忙分析下问题到底在哪里吧.
...全文
225 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangseraph 2011-06-08
  • 打赏
  • 举报
回复
结贴结贴!

测试环境运行两周,上线运行1周, 该问题没有再次出现.

附上我的修改如下
myCmd.Parameters.Clear();
小童 2011-05-17
  • 打赏
  • 举报
回复
threenewbee 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sandy945 的回复:]
myCmd.ExecuteNonQuery();

=>

myCmd.ExecuteNonQuery();
myCmd.Clear();
[/Quote]
赞下阿非,向阿非学习。
jiangseraph 2011-05-17
  • 打赏
  • 举报
回复
感谢Sandy945的指点

SQL Command执行后 clear,用于确保唯一引用

我这就更新代码,然后测试段时间看看. 谢谢!!

阿非 2011-05-17
  • 打赏
  • 举报
回复
myCmd.ExecuteNonQuery();

=>

myCmd.ExecuteNonQuery();
myCmd.Clear();
jiangseraph 2011-05-17
  • 打赏
  • 举报
回复
To Sandy945,
谢谢, 我看了下代码runStoredProcedure中是new SqlCommand, 代码继续贴


private static string runStoredProcedure(string spName, List<SqlParameter> parameters)
{
SqlConnection conn;
SqlCommand myCmd;

using (conn = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
try
{
conn.Open();
myCmd = new SqlCommand(spName, conn);
myCmd.CommandType = CommandType.StoredProcedure;
myCmd.CommandTimeout = Int32.Parse(Properties.Settings.Default.GlobalDatabaseTimeout);

// Set up parameters
foreach (SqlParameter param in parameters)
{
myCmd.Parameters.Add(param);
}

myCmd.ExecuteNonQuery();
}
catch (SqlException oe)
{...
return (oe.Message);
}
catch (Exception e)
{...}

conn.Close();
conn.Dispose();
conn = null;
GC.Collect();
}
return ("Success");
}
阿非 2011-05-17
  • 打赏
  • 举报
回复
你的参数为null了呗
----------------
是错误的,值类型怎能为null



你需要调用的不是List<SqlParameter> parameters 的clear

而是执行对象 SqlCommand 的 clear

看一下 runStoredProcedure 内部
jiangseraph 2011-05-17
  • 打赏
  • 举报
回复
To Mockqi, 正如您所说,是的

To Sandy945,谢谢您的回复.

函数UpdateTankProductVolumeHistory_Flag的代码如下, 我已经调用了clear, parameters是一个全局变量, 请看一看这段代码是否有问题


private List<SqlParameter> parameters = new List<SqlParameter>();
...
public string UpdateTankProductVolumeHistory_Flag(long HistoryID)
{
parameters.Clear();
parameters.Add(new SqlParameter("@intHistory", HistoryID));
return runStoredProcedure("usp_eFUEL_UpdateTankProductVolumeHistory_Flag", parameters);
}



  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiangseraph 的回复:]

To caozhy,谢谢您的提醒!

这个已经知道鸟.不过我在上面已经提到了,这个程序是可以正常运行的,故障偶尔会出现
[/Quote]

故障偶尔会出现 偶尔你的参数为null了呗。。。
jiangseraph 2011-05-17
  • 打赏
  • 举报
回复
To zx75991,
再贴一遍代码, {...}里面都是日志,如果您还有哪里想知道,请明确指出


DataSet ds = GetTankDelivery();

int UpdateRecords = ds.Tables[0].Rows.Count;
if (UpdateRecords == 0)
{...}
else
{
string StartID = ds.Tables[0].Rows[0][0].ToString();
long EndID = Int64.Parse(ds.Tables[0].Rows[UpdateRecords - 1][0].ToString());

OnlineWebService.WebService oWebService = new OnlineWebService.WebService();
// Import data to BI
if (oWebService.ProcessTankDelivery(ds))
{
string Result = UpdateTankProductVolumeHistory_Flag(EndID);
if (Result == "Success")
{...}
else
{
log.Error("[" + state.ToString() + "]--Update table flag fail, return: " + Result);
}
}
else
{...}
}

阿非 2011-05-17
  • 打赏
  • 举报
回复
如果未果,可在使用问题 SqlParameter 时,进行Clone 操作
阿非 2011-05-17
  • 打赏
  • 举报
回复
The SqlParameter is already contained by another SqlParameterCollection

我猜这句才是问题真正的所在。

可以尝试将 SqlParameter 在执行后 clear ,用于确保唯一引用
jiangseraph 2011-05-17
  • 打赏
  • 举报
回复
To caozhy,谢谢您的提醒!

这个已经知道鸟.不过我在上面已经提到了,这个程序是可以正常运行的,故障偶尔会出现
天下在我心 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
调用存储过程 usp_eFUEL_UpdateTankProductVolumeHistory_Flag 缺少参数 '@intHistory'
[/Quote]
已经给你指出来了,代码能否贴的全点
threenewbee 2011-05-17
  • 打赏
  • 举报
回复
调用存储过程 usp_eFUEL_UpdateTankProductVolumeHistory_Flag 缺少参数 '@intHistory'

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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