【问题标题】:C# stored procedure with parameters带参数的 C# 存储过程
【发布时间】:2011-09-06 07:14:11
【问题描述】:

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

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

谢谢,

马特

【问题讨论】:

  • 我认为问题出在这一行 myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;如果您的班级有成员 Name 尝试添加为参数 t.Name。
  • @All - 令人惊讶的是,我们所有人都以如此之快的速度回答了这个问题。世界上有太多的C#程序员! ;)
  • 别忘了给问题点赞 :)。 9 个回答,3 cmets 只有 1 票不对
  • 哇。除了我,每个人都看到了那个。哈哈。
  • 更多建议:(1)无需检查是否有行,如果没有返回行,while (reader.Read()) 将正确跳过。 (2) 我会使用 using 语句来封装那些 sql 命令和连接。在不处理那些非托管资源的情况下,您不希望发生任何类型的内存泄漏。

标签: c# sql stored-procedures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为问题出在这一行:

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

    t 不能转换为字符串。你可以试试t.Name or t.ToString()(我不知道该类有哪些可用的属性。)

    【讨论】:

      【解决方案3】:

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

      这是您的代码:

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

      【讨论】:

      • 好吧,我给了你+1 基本上,我们都有相同的答案,而且几乎在同一时间。如果我们认为我们的答案很好,我们认为每个人的答案都很好。
      【解决方案4】:

      问题出在这一行:

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

      您传入的是任务对象,而不是任务的名称。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 废话。我没有意识到我正在使用该任务。感谢您指出这一点。
        【解决方案6】:

        行内:

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

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

        【讨论】:

          【解决方案7】:

          上线:

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

          't' 是一个任务,而不是一个字符串。您需要获取任务名称(从外观上看)

          【讨论】:

            【解决方案8】:
              myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
            

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

            【讨论】:

              【解决方案9】:

              我的猜测是在

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

              t 不是字符串?

              【讨论】:

              • 不,这是一项任务。谢谢大家
              猜你喜欢
              • 2020-02-12
              • 1970-01-01
              • 2011-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多