带参数的C#存储过程

时间:2011-06-01 13:15:46

标签: c# sql stored-procedures

我在应用程序中收到错误,我无法弄清楚如何解决它。这是代码:

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语句中),但我不确定。任何帮助将不胜感激。

谢谢,

马特

9 个答案:

答案 0 :(得分:18)

我猜是

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

t不是字符串?

答案 1 :(得分:9)

t类型为Task但是当您将其传递给存储过程时,您将其作为nvarchar传递。

这是你的代码:

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

答案 2 :(得分:7)

假设您的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;

答案 3 :(得分:6)

在行中:

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

我认为你必须在任务名称上传递t.Namet.ToString()(我不知道)。

答案 4 :(得分:5)

我认为问题在于这一行:

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

t无法转换为字符串。您可以尝试t.Name or t.ToString()(不确定该类别上可用的属性。)

答案 5 :(得分:5)

T是Task的类型,并且尝试将其转换为字符串 你应该把t.GetType().Name或真正的任务名称放在这里 因为我们不能将对象作为参数传递,唯一的类型是已知的sqltypes

答案 6 :(得分:4)

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

tTask而不是字符串。这应该是name

答案 7 :(得分:4)

在线:

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

't'是一个任务,而不是一个字符串。您需要获取任务名称(通过它的外观)

答案 8 :(得分:4)

问题出在这一行:

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

您正在传递任务对象而不是任务名称。