web-dev-qa-db-ja.com

パラメータ付きのC#ストアドプロシージャ

アプリケーションでエラーが発生し、解決方法がわかりません。これがコードです:

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ステートメント内)と関係があると思いましたが、よくわかりません。どんな助けでも大歓迎です。

おかげで、

マット

17
Matt

私の推測では

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

tは文字列ではありませんか?

18
Pleun

tはTask型ですが、ストアドプロシージャに渡すときはnvarcharとして渡します。

これがあなたのコードです:

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

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;
_
7
Mark Coleman

行:

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

タスクの名前に_t.Name_またはt.ToString()を渡す必要があると思います(わかりません)。

6
Homam

問題はこの行にあると思います:

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

tは文字列に変換できません。あなたはt.Name or t.ToString()を試すことができます(私の頭の上からそのクラスで利用できるプロパティはわかりません)。

5
rsbarro

TはTaskのタイプであり、文字列に変換してみてください。t.GetType().Nameまたは実際のタスク名をここに入力する必要があります。オブジェクトをパラメーターとして渡すことができないため、既知のsqltypeのみがタイプです。

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

tTaskであり、文字列ではありません。これはおそらくnameになるはずです。

4
Tim Rogers

ライン上:

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

't'は文字列ではなくタスクです。代わりにタスク名を取得する必要があります(その外観から)

4
Rangoric

問題はこの行にあります:

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

タスクの名前の代わりにタスクオブジェクトを渡しています。

4
IAmTimCorey