C#带参数的存储过程

19

我在我的应用程序中遇到了一个错误,但是我不知道如何解决它。以下是代码:

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


1
我认为问题出在这一行: myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t; 如果你的类有一个成员名称,请尝试将其作为参数t.Name添加。 - Mehmetali Shaqiri
1
@所有人 - 大家回答得真快啊。世界上有太多的C#程序员了!;) - JonH
3
各位不要忘记点赞这个问题:)。9个答案,3条评论,仅1个投票是不对的。 - Ivo
2
哇,每个人都看到了,就我没看到。LOL。 - Matt
2
还有几个建议:(1)不需要检查是否有行,while(reader.Read())将正确跳过如果没有返回任何行。(2)我会使用using语句来封装这些SQL命令和连接。您不希望在未处理这些非托管资源的情况下发生任何内存泄漏。 - Nathan Tregillus
显示剩余2条评论
9个回答

19

我猜想,

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

这是一个问题吗?它不是一个字符串吗?

不,这是一项任务。谢谢大家。 - Matt

9
它的类型是Task,但当你将其传递给存储过程时,却将其作为nvarchar传递。

这是你的代码:

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

1
好的,我给你加了一分。基本上,我们都有相同的答案,而且几乎同时回答。如果我们认为自己的答案很好,那么我们也会认为其他人的答案也很好。 - IAmTimCorey

7
假设您的变量name确实是@TaskName,那么只需使用name即可。
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = name;

或者如果你重写了 ToString() 方法

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

如果您的Task对象上有Name属性。
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t.Name;

糟糕,我没意识到我正在使用该任务。感谢您指出这一点。 - Matt

6
在这行代码中:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

我认为你需要在任务名称中传递t.Namet.ToString()(我不知道它的具体名称)。


5

我认为问题出在这行代码上:

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

它不能被转换为字符串。您可以尝试 t.Name 或 t.ToString()(我不确定该类上有哪些属性)。

5

T是任务的类型,尝试将其转换为字符串。你应该在这里放置t.GetType().Name或者真实的任务名称,因为我们不能将对象作为参数传递,唯一可用的类型是已知的sql类型。


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

t 是一个 Task 而不是字符串,这可能应该改为 name


4

在线:

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

't'是一个任务,不是字符串。从外表看,您需要获取任务名称。


4
问题出在这一行代码上:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接