2012-02-09 10 views
0

두 번째 마지막 행의 ExecuteNonQuery에서 어색한 오류가 발생합니다.입력 문자열의 형식이 올바르지 않습니다.

Errormassage는 : System.FormatException :

닷넷 프레임 워크 오류 사용자 정의 루틴 또는 집계 "sp_InsertShuttleCount"의 실행 중에 발생한 입력 문자열의 형식이 잘못되었습니다. System.FormatException : AtsProcedures에서 System.Number.StringToNumber (문자열 str을, NumberStyles 옵션 NumberBuffer & 번호,하는 NumberFormatInfo 정보, 부울 parseDecimal) System.Number.ParseInt32에서 (String를, NumberStyles 스타일,하는 NumberFormatInfo 정보) 에서 . InsertShuttleErrorCount (SqlString 셔틀, SqlString 스테이션, SqlString 오류 상태, SqlString 중첩, SqlString 오류 네임, SqlDateTime ts) .

스택 트레이스 :

System.Data.SqlClient.SqlInternalConnection.OnError에서 System.Data.SqlClient.SqlConnection.OnError (SQLEXCEPTION 예외 부울 breakConnection) 에서

(SQLEXCEPTION 예외 부울 breakConnection) System.Data.SqlClient.SqlCommand.FinishExecut에서 System.Data.SqlClient.TdsParser.Run에서 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() (runBehavior runBehavior, SqlCommand를 cmdHandler, SqlDataReader의 데이터 스트림, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)에서 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)에서 을 eReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) RunBehavior runBehavior, System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery에서 부울 returnStream 문자열 방법 DbAsyncResult 결과) (DbAsyncResult 결과, ATS_Test_Data_Generator에서 System.Data.SqlClient.SqlCommand.ExecuteNonQuery에서 문자열 methodName로 부울 sendToPipe) () . C : \ Code \ ATSBDE \ C# \에서 Form1..ctor()를 생성하십시오. Data \ ATS_Test_Data_Generator \ ATS_Test_Data_Generator \ Form1.cs :at ATS_Test_Data_Generator.Program.Main() in C : \ Code \ ATSBDE \ C# \ 데이터 생성 \ ATS_Test_Data_Gen System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args)의 에서 System.AppDomain._nExecuteAssembly ()에서 을 입력하십시오. at Microsoft.VisualStudio .HostingProcess.HostProc.RunUsersAssembly()에서 System.Threading.ExecutionContext.Run System.Threading.ThreadHelper.ThreadStart_Context (객체 상태)에서 (ExecutionContext에 ExecutionContext에, ContextCallback 콜백, 부울 ignoreSyncCtx를 상태 객체)에 System.Threading.ExecutionContext .Run (ExecutionContext executionContext, ContextCallback 콜백, 개체 상태) at 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 | 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; 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8; 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8; 4 | 5 | 6 | 7 | 8;

ErrorNests : 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0; 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1; 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1; 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1;

D는 날짜 시간이다 d.ToString() "10.02.2012 6시 1분 0초은"문자열

저장된 절차 4 NVARCHAR (4000)를 취하고 한 날짜 시간 저장

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가 있습니다.

PROCEDURE [DBO]. sp_InsertShuttleCount] @shuttle NVARCHAR, @stations의 NVARCHAR, @errorstations의 NVARCHAR, @nests의 NVARCHAR, @errornests의 NVARCHAR, @ts는 [날짜] WITH CALLER AS EXECUTE CREATE EXTERNAL NAME 같이 ATS-CLR]. AtsProcedures]. InsertShuttleErrorCount] GO

EXEC sys.sp_addextendedproperty의 이름 @ = N'SqlAssemblyFile '@ 값 = N'AtsProcedures.cs'@의 level0type = N ' SCHEMA ', @ level0name = N'dbo', @ level1type = N'PROCEDURE ', @ level1name = N'sp _InsertShuttleCount 'GO

EXEC의 sys.sp_addextendedproperty의 이름 @ = N'SqlAssemblyFileLine'@ 값 = N'51 '@ level0type = N'SCHEMA'@ level0name = N'dbo '@ level1type = N'PROCEDURE ', @ level1name = N'sp_InsertShuttleCount' GO

내 코드에 어떤 문제가 있습니까?

+0

저장 프로 시저도 게시 할 수 있습니까? 문제가있을 수 있습니다. – aaronj

+0

예. 그리고 4 개의 nvarchars와 1 개의 datetime이 걸리거나 오타가 있었습니까? 당신은 6 개의 인수로 호출합니다. 그 중 5 개는 nvarchar입니다. –

답변

0

각 문자열의 끝에 세미콜론에 문제가있었습니다 ...

0

아마도 문제는 reader.GetInt32(0) 일 것입니다. 당신은 가장 적절하게 파싱되지 않는 값을 치는 경향이 있습니다. 오류가 발생하면 reader [0]의 값을 검사 해보십시오. 또한 GetInt32는 데이터베이스에 NULL 값이있는 경우 실패합니다. NULL이있는 경우 적절한 if 조건을 사용하여 reader.IsDBNUll(0)을 먼저 호출하십시오.

+0

함수 호출은 오류를 발생시키지 않습니다. – TheJoeIaut

관련 문제