Подтвердить что ты не робот

Хранимая процедура С# с параметрами

Я получаю сообщение об ошибке в своем приложении, и я не могу понять, как его решить. Вот код:

SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
myConnection.Open();

SqlCommand cmd = new SqlCommand("SELECT ServerIP FROM Servers", myConnection);

SqlDataReader rdr = cmd.ExecuteReader();

if (rdr.HasRows)
{
   while (rdr.Read())
   {
      string serverIP = rdr["ServerIP"].ToString();
      ScheduledTasks st = new ScheduledTasks(@"\\" + serverIP);
      string[] taskNames = st.GetTaskNames();

      foreach (string name in taskNames)
      {
         Task t = st.OpenTask(name);
         var status = t.Status;
         var recentRun = t.MostRecentRunTime;
         var nextRun = t.NextRunTime;
         var appName = t.ApplicationName;

         SqlConnection myConnection2 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
         SqlCommand myCommand2 = new SqlCommand("sp_AddScheduledTasks", myConnection2);

         try
         {
            myConnection2.Open();
            myCommand2.CommandType = CommandType.StoredProcedure;
            myCommand2.Parameters.Add("@ID", SqlDbType.Int);
            myCommand2.Parameters["@ID"].Direction = ParameterDirection.Output;
            myCommand2.Parameters.Add("@ServerIP", SqlDbType.NVarChar, 20).Value = serverIP;
            myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
            myCommand2.Parameters.Add("@MostRecentRun", SqlDbType.DateTime).Value = recentRun;
            myCommand2.Parameters.Add("@NextRunTime", SqlDbType.DateTime).Value = nextRun;
            myCommand2.Parameters.Add("@AppName", SqlDbType.NVarChar, 50).Value = appName;
            myCommand2.Parameters.Add("@Status", SqlDbType.NVarChar, 50).Value = status;

            int rows = myCommand2.ExecuteNonQuery();
         }
         finally
         {
            myConnection2.Close();
         }

Ошибка, которую я получаю, связана с ExecuteNonQuery. В нем говорится:

InvalidCastException не удалось преобразовать значение параметра из задачи в Строка.

Я думал, что это как-то связано с тем, где я поставил try (внутри оператора if), но я не уверен. Любая помощь будет высоко оценена.

Спасибо,

Matt

4b9b3361

Ответ 1

Я предполагаю, что в

   myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

t не является строкой?

Ответ 2

t имеет тип Task, но когда вы передаете его в свою хранимую процедуру, вы передаете его как nvarchar.

Вот ваш код:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

Ответ 3

Предполагая, что ваша переменная name действительно является @TaskName, просто используйте name

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = name;

или если вы переопределите ToString()

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t.ToString();

или если у вас name на объекте Task

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t.Name;

Ответ 4

В строке:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

Я думаю, вам нужно передать t.Name или t.ToString() вверх по имени задачи (я этого не знаю).

Ответ 5

Я думаю, проблема в этой строке:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

t не может быть преобразован в строку. Вы можете попробовать t.Name or t.ToString() (не знаете, какие свойства доступны для этого класса с моей головы.)

Ответ 6

T - это тип задачи, и и ado попробуйте преобразовать его в строку вы должны положить t.GetType().Name или имя реальной задачи здесь потому что мы не можем передавать объекты в качестве параметра, единственный тип которого известен sqltypes

Ответ 7

  myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

t является Task не строкой. Вероятно, это должно быть на name.

Ответ 8

В строке:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

't' - задача, а не строка. Вам нужно вместо этого получить имя задачи (по внешнему виду)

Ответ 9

Проблема в этой строке:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

Вы передаете объект задачи вместо имени задачи.