【问题标题】:SQLDataAdapter.Fill errorSQLDataAdapter.Fill 错误
【发布时间】:2014-02-25 09:27:14
【问题描述】:

在以下代码中使用时出现错误。并非所有记录都发生这种情况。但在 5000 笔交易中,至少有 10 次我遇到了错误。我交叉检查了数据库中的数据,数据很好,但我不确定为什么会出现这个错误。请您帮我展示代码实现的正确路径。

服务方式: public List GetStockPIN(string sInput) { List listStockInfo = new List(); try { DEBUG("Info from GetStockPIN : ", sInput); // Parse request string Parseparams(sInput); string sTerminalId = GetValue("TerminalId"); string sMerchantId = GetValue("MerchantId"); string sBankCode= GetValue("BankCode"); string sAppId = GetValue("AppId"); string sProductName = GetValue("ProductName"); string sDenomName = GetValue("DenomName"); string sQTY = GetValue("QTY"); StockRepository objStockRepository = new StockRepository(sConString) { DenomName = sDenomName, ProductName = sProductName, TerminalId = sTerminalId, Qty = Convert.ToInt32(sQTY) }; listStockInfo = objStockRepository.GetStockPIN(); return listStockInfo; } catch (Exception ex) { DEBUG("Error from GetStockPIN : ", ex); return listStockInfo; } } 数据库访问方法: public List GetStockPIN() { DataTable dtrec = new DataTable(); List objStockInfo = new List(); SqlConnection conn = null; try { using (conn = new SqlConnection(sConnectionString)) { using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "prc_GetStockPIN"; cmd.Parameters.Add(new SqlParameter("@TerminalId", SqlDbType.NVarChar)); cmd.Parameters["@TerminalId"].Value = TerminalId; cmd.Parameters.Add(new SqlParameter("@ProductName", SqlDbType.VarChar)); cmd.Parameters["@ProductName"].Value = ProductName; cmd.Parameters.Add(new SqlParameter("@DenomName", SqlDbType.VarChar)); cmd.Parameters["@DenomName"].Value = DenomName; cmd.Parameters.Add(new SqlParameter("@Qty", SqlDbType.Int)); cmd.Parameters["@Qty"].Value = Qty; conn.Open(); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { da.Fill(dtrec); } //Some additional code that generates List } } } catch (Exception error) { throw error; } finally { if (conn != null) { try { conn.Close(); } catch (Exception ex) { } } } return objStockInfo; } }

这里是异常输出:

调试:来自 GetStockPIN 的错误: 在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action`1 wrapCloseInAction) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection,Action`1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用者HasConnectionLock,布尔异步关闭) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean & dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,字符串 resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔异步,Int32 超时,任务和任务,布尔异步写入,SqlDataReader ds) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法,TaskCompletionSource`1 完成,Int32 超时,任务和任务,布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法) 在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为) 在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为) 在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为) 在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand 命令,CommandBehavior 行为) 在 System.Data.Common.DbDataAdapter.Fill(DataTable 数据表) 在 TAMSBulkPIN.DAL.StockRepository.GetStockPIN() 在 TAMSBulkPIN.BulkPINSVC.GetStockPIN(字符串 sInput)

【问题讨论】:

  • 您能否也提供您收到的实际错误消息,因为您提供的堆栈跟踪实际上并未显示这一点。
  • @MartinParkin 我正在提供使用我拥有的代码获得的异常详细信息。

标签: c# sqlcommand


【解决方案1】:

将连接名称传递给数据适配器对象

using (SqlDataAdapter da = new SqlDataAdapter(cmd,/* your connection object*/))
{
   try
   {
      da.Fill(dtrec);
   }
}

【讨论】:

    【解决方案2】:

    用 try/catch 包装它并记录异常的消息和内部异常。

    【讨论】:

      【解决方案3】:

      您的数据可能对某些行具有某种“高精度”。

      数据适配器不填充这些行。相反,它会抛出异常。检查代码中的“十进制”数据类型。

      【讨论】:

        猜你喜欢
        • 2019-07-29
        • 2010-09-20
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多