Входная строка была не в правильном формате - PullRequest
0 голосов
/ 09 февраля 2012

Я получаю неловкую ошибку в ExecuteNonQuery во второй последней строке.

Errormassage:

Ошибка .NET Framework при выполнении пользовательской процедуры или агрегата "sp_InsertShuttleCount ": System.FormatException: входная строка была в неправильном формате.System.Станции SqlString, ошибки SqlString, гнезда SqlString, ошибки SqlString, SqlDateTime ts).

Stacktrace:

в System.Data.SqlClient.SqlConnection.SnExrorBoolean breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () в System.Data.SqlClient.TiorqShl_SlayerShReSeRBSDRDSerSlayerShWRDdataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, Striнг resetOptionsString) при System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean, Boolean returnStream асинхронном) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булевой returnStream, метод String, DbAsyncResultрезультат) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (результат DbAsyncResult, строковый метод methodName, логическое sendToPipe) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в ATS_Test \ Form.FD_D_F_D_F_D_F_D_F_D_F_D_F_D_F_D_F_D_F_S_F_D_F_S_S_S_S_S_S_S_S_S_S_S_S_S_S_R&G_Rate&N========>\ c # \ Генерировать данные \ ATS_Test_Data_Generator \ ATS_Test_Data_Generator \ Form1.cs: строка 113 в ATS_Test_Data_Generator.Program.Main () в C: \ Code \ ATSBDE \ c # \ Создать данные \ ATS_Test_Data_Generator \ ATS_Generator \ ATS_G:.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, аргументы String []) в System.AppDomain.ExecuteAssembly (файл String assemblyFile, Evidence AssemblySecurity, String []) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtxt.Extain.Exe) в системеExecutionContext executeContext, обратный вызов 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 | 56 | 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 - это Datetime: d.ToString () "10.02.2012 06:01:00" string

Хранимая процедура занимает 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, которые были опечаткой.

CREATE PROCEDURE [dbo]. [Sp_InsertShuttleCount] @shuttle nvarchar, @stations nvarchar, @errorstations nvarchar, @nests nvarchar, @errornests nvarchar, @ts [datetime] С ВЫПОЛНИТЬ КАК ВЫЗОВ КАК ВНЕШНЕЕ ИМЯ [ats-clr]. [AtsProcedures]. [InsertShuttleErrorCount] GO

EXEC sys.sp_addextendedproperty @ name = N'SqlAssemblyFile ', @ value = N'AtsProcedures.cs', @ level0type = N'SCHEMA ', @ level0name = N'dbo', @ level1type = N'PROCEDURE ', @ level1name = N'sp_InsertShuttleCount» GO

EXEC sys.sp_addextendedproperty @ name = N'SqlAssemblyFileLine ', @ value = N'51', @ level0type = N'SCHEMA ', @ level0name = N'dbo', @ level1type = N'PROCEDURE ', @ level1name = N'sp_InsertShuttleCount» GO

Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

У меня были проблемы с точкой с запятой в конце каждой строки ...

0 голосов
/ 10 февраля 2012

Ваша проблема, вероятно, с reader.GetInt32(0). Скорее всего, вы попали в значение, которое не анализируется должным образом. Попробуйте проверить значение reader [0] при возникновении ошибки. Также имейте в виду, что GetInt32 потерпит неудачу, если он достигнет значения NULL в базе данных. Если у вас NULL, сначала вызовите reader.IsDBNUll(0) с соответствующим условием if.

...