2012-02-09 186 views
0

我在第二行的ExecuteNonQuery中遇到了一個尷尬的錯誤。輸入字符串格式不正確

Errormassage: System.FormatException:用戶定義的例程或聚合「sp_InsertShuttleCount」執行過程中出現

一個.NET Framework錯誤輸入字符串的不正確的格式。 System.FormatException: 在System.Number.StringToNumber(字符串str的NumberStyles選項,NumberBuffer &數的NumberFormatInfo信息,布爾parseDecimal) 在System.Number.ParseInt32(字符串s的NumberStyles風格的NumberFormatInfo信息) 在AtsProcedures。 InsertShuttleErrorCount(SqlString穿梭,SqlString站,SqlString錯誤,SqlString巢,SqlString錯誤,SqlDateTime ts) 。

堆棧跟蹤:

在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的數據流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 在System.Data.SqlClient.SqlCommand.FinishExecut eReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, runBehavior runBehavior,布爾returnStream,字符串方法,DbAsyncResult結果) 在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult結果,字符串方法名,布爾sendToPipe) 在System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在ATS_Test_Data_Generator。 C:\ Code \ ATSBDE \ c#\ Generate Data \ ATS_Test_Data_Generator \ ATS_Test_Data_Generator \ Form1.cs中的Form1..ctor():第113行 位於C:\ Code \ ATSBDE \ c#\中的ATS_Test_Data_Generator.Program.Main \ ATS_Test_Data_Gen在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args) at 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 callback,Object state) 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 | 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;

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

d是一個日期時間:d.ToString() 「10.02.2012 6點01分00秒」 的字符串

存儲過程需要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是一個錯字。

CREATE PROCEDURE [DBO]。[sp_InsertShuttleCount] @shuttle nvarchar的, @stations nvarchar的, @errorstations nvarchar的, @nests nvarchar的, @errornests nvarchar的, @ts [DATETIME] WITH EXECUTE AS CALLER AS 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 2012-02-09 17:44:48

+0

是的。它需要4個nvarchars和1個​​日期時間,或者是一個錯字?你用6個參數來調用它,其中5個是nvarchars。 – 2012-02-09 17:45:56

回答

0

我我在每個字符串末尾有分號問題...

0

您的問題可能是reader.GetInt32(0)。你最有可能觸及一個無法正確解析的值。發生錯誤時嘗試檢查reader [0]的值。另外請記住,如果GetInt32在數據庫中遇到空值,它將會失敗。如果您有空值,則首先調用reader.IsDBNUll(0),並帶有適當的if條件。

+0

該函數調用dosn't創建任何錯誤。 – TheJoeIaut 2012-02-10 09:20:24