C # хранимая процедура с параметрами - PullRequest
17 голосов
/ 01 июня 2011

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

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 Не удалось преобразовать значение параметра из задачи в Строка.

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

Спасибо

Мэтт

Ответы [ 9 ]

18 голосов
/ 01 июня 2011

Я думаю, что в

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

т не строка?

9 голосов
/ 01 июня 2011

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

Вот ваш код:

myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
7 голосов
/ 01 июня 2011

Если ваша 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;
6 голосов
/ 01 июня 2011

В строке:

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

Я думаю, вы должны указать t.Name или t.ToString() в имени задачи (я не знаю).

5 голосов
/ 01 июня 2011

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

5 голосов
/ 01 июня 2011

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

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

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

4 голосов
/ 01 июня 2011

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

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

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

4 голосов
/ 01 июня 2011

В строке:

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

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

4 голосов
/ 01 июня 2011
  myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...