我在倒数第二行的ExecuteNonQuery中遇到一个尴尬的错误。
错误消息:
在执行用户定义例程或聚合"sp_InsertShuttleCount"期间发生.NET Framework错误:System.FormatException:输入字符串的格式不正确。System.FormatException:在System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、NumberFormatInfo信息、Boolean parseDecimal)位于System.Number.ParseInt32(字符串s,NumberStyles样式,NumberFormatInfo信息)在AtsProcedures。InsertShuttleErrorCount(SqlString穿梭程序、SqlString工作站、SqlString错误工作站、Sql字符串嵌套、Sql字符串错误嵌套、SqlDateTime ts).
Stacktrace:
位于System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)位于System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection)位于System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()位于System.Data.SqlClient.TdsParser.Run(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)位于System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior RunBehavior,String resetOptionsString)位于System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior RunBehavior、Boolean returnStream、Boolean async)位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior RunBehavior、Boolean returnStream、String方法、DbAsyncResult结果)位于System.Data.SqlClient.SqlCommand.InteralExecuteNonQuery(DbAsyncResult结果,String methodName,布尔sendToPipe)位于System.Data.SqlClient.SqlCommand.ExecuteNonQuery()位于C:\Code\ATSBDE\C#\Generate Data\ATS_Test_Data_Generator\ATS_Test_Data_Gnerator\Form1.ctor()中。cs:cline 113在C:\Code\ATSBDE\C#\Generate Data\ATS_Test_Data_Generator\ATS_Test_Data_Gnerator\Program.Main()中位于System.AppDomain_nExecuteAssembly(RuntimeAssembly程序集,String[]参数)位于System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String[]args)位于Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()位于System.Threading.ThreadHelper.ThreadStart_Context(对象状态)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)位于System.Threading.ThreadHelper.ThreadStart()
字符串的值
站点:0;5.10;15;20;30;35;40;55;60;65;70;80;85;90;100;110;120;125;
错误站:5;3.4.4.6.6.4.5.4.4.6.4.4.5.5.4.5.3.5.
嵌套:1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;1|2|3|4|5|6|7|8;
错误嵌套:0|1|1|0|1|1|0;1|0|1|0|0|1 |0|0;0|1|0|0|1|1|1;1|0|1|0|1|1|0;1|1|1|0|1|1|0;1|1|0|1|0|1 |1;1|1|1|0|0|0;0|1|1|1|0|0|1;1|1|0|0|1|1|0;0|0|0|1|1|0|1|1;0|1|1|1|0|1|1;1|0|0|1|0|1;0|0|1|1|0|0|1;1|1|1|0|1|0|0;0|1|0|1|1|0|1;0|1|1|0|1|0|0;1|1|0|1|0|1;0|1|0|0|1|0\1|0;1|1|1|0|0|1|1;
D是日期时间:D.ToString()"10.02.2012 06:01:00"字符串
存储过程采用4个Nvarchar(4000)和一个Datetime值
for (int i = 0; i <= 16; i++) {
String Stations="";
String ErrorStations = "";
String Nests = "";
String ErrorNests = "";
command = new SqlCommand(null, connection) {
CommandText = "ats.sp_getStations",
CommandType = CommandType.StoredProcedure
};
SqlDataReader reader = command.ExecuteReader();
int k = 0;
while (reader.Read()) {
Stations += reader.GetInt32(0)+";";
Nests += "1|2|3|4|5|6|7|8;";
int m=0;
for (int j = 0; j < 8; j++) {
int l;
l=r.Next(0, 2);
nestcounts[i, k, j] += l;
m += l;
if(j!=7)
ErrorNests += nestcounts[i, k, j] + "|";
else
ErrorNests += nestcounts[i, k, j] + ";";
}
stationcounts[i, k] += m;
ErrorStations += stationcounts[i, k] + ";";
k++;
}
reader.Close();
command.Dispose();
command = new SqlCommand(null, connection) {
CommandText = "exec dbo.sp_InsertShuttleCount @shuttle, @stations, @errorstations, @nests, @errornests, @ts",
};
command.Parameters.Clear();
command.Parameters.Add("@shuttle", SqlDbType.NVarChar, 4000).Value = "1";
command.Parameters.Add("@stations", SqlDbType.NVarChar, 4000).Value = Stations;
command.Parameters.Add("@errorstations", SqlDbType.NVarChar, 4000).Value = ErrorStations;
command.Parameters.Add("@nests", SqlDbType.NVarChar, 4000).Value = Nests;
command.Parameters.Add("@errornests", SqlDbType.NVarChar, 4000).Value = ErrorNests;
command.Parameters.Add("@ts", SqlDbType.DateTime).Value = d;
command.ExecuteNonQuery();
command.Dispose();
}
存储过程
这是一个运行良好的CLR过程,因为它经常使用。当然还有5个Nvarchars是打字错误。
创建过程[dbo]。[sp_InsertShuttleCount]@穿梭机nvarchar,@nvarchar站,@错误站nvarchar,@巢nvarchar,@errornests nvarchar,@ts[日期时间]以EXECUTE作为调用方作为外部名称[ats clr]。[AtsProcedures]。[InsertShuttleErrorCount]转到
EXEC sys.sp_addextendedproperty@name=N'SqlAssemblyFile',@value=N'AtsProcedures.cs',@level0type=N'SCHEMA',@level0name=N'dbo',@level1type=N'dPROCEDURE',@level 1name=N_sp_InsertShuttleCount'转到
EXEC sys.sp_addextendedproperty@name=N'SqlAssemblyFileLine',@value=N'51',@level0type=N'SCHEMA',@level0name=N'dbo',@level 1type=N'dPROCEDURE',@level1name=Nsp_InsertShuttleCount'转到
我的代码出了什么问题?
您的问题可能是reader.GetInt32(0)
。您很可能遇到了无法正确解析的值。出现错误时,请尝试检查读取器[0]的值。还要记住,如果GetInt32在数据库中达到NULL值,它将失败。如果有NULL,请首先使用适当的If条件调用reader.IsDBNUll(0)
。
我在每个字符串末尾的分号上都有问题。。。