Я получаю неловкую ошибку в 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
Что не так с моим кодом?