2017-04-18 136 views
0

对数据库的查询工作正常并返回行。 但是在某些时候,运行程序大约需要2分钟,它会崩溃并显示下面的错误。C#sqlDataReader.Read()导致转换失败错误

未处理的异常:System.Data.SqlClient.SqlException:将varchar值“NULL”转换为数据类型为int时,转换 失败。
在System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔breakConnection,动作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)在 系统.Data.SqlClient.TdsParser.TryRun(runBehavior runBehavior, 的SqlCommand cmdHandler,SqlDataReader的数据流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔& dataReady)在 System.Data.SqlClient.SqlDataReader.TryHasMoreRows(布尔& moreRows) 在系统.Data.SqlClient.SqlDataReader.TryReadInternal(布尔 setTimeout的,布尔&更多)处 TrackChanges.Program.Main(字串[] args) System.Data.SqlClient.SqlDataReader.Read()在 C:\用户\ ari.dow​​ney \ Documents \ Visual Studio 2015 \ Projects \ TrackChanges \ TrackChanges \ Program.cs:line 31按任意键 继续。 。 。

using (SqlCommand cmd = new SqlCommand(query, conn)) 
{ 
    conn.Open(); 
    SqlDataReader read = cmd.ExecuteReader(); 

    while (read.Read()) 
    { 
     if (read[4].ToString().ToUpper() != columns[4].ToUpper()) 
     { 
      for (int i = 0; i < read.FieldCount; i++) 
       Console.Write(read[i] + " || " + columns[i] + " "); 
      Console.WriteLine(" "); 
     } 
    }      
    conn.Close(); 
} 

我道歉代码是纯文本。我需要提出一个问题来获得更多的声誉,但除此之外,我没有相关的问题要问。

+0

如果可以编辑,编辑问题并添加执行的SQL(如果不能),请将其添加为注释,以便将其添加到问题中 – bradbury9

+0

未处理的异常:System.Data.SqlClient.SqlException:**转换 将varchar值“NULL”转换为数据类型int。**时失败。你必须检查'null' –

+0

查询SQL数据库时,应该在查询中使用参数。否则,驱动器会尝试猜测数据类型,有时会猜测错误。这就像在excel工作簿中使用GENERAL细胞类型一样。 – jdweng

回答

0

当数组数据从0开始时,您的计数是否从1开始?

+0

哪个数字? read.FieldCount()? – aDowney

0

这里的问题可能是正在进行的转换是不可能的。 INT永远不可能是NULL,它必须是。您也可以不将“NULL”的varchar/string值转换为int,因为它不代表整数值。

正如你得到的例外中所述。 将varchar值“NULL”转换为数据类型int时转换失败。

尝试使用Int32.TryParse。你应该能够捕捉并处理值。