アプリケーションでエラーが発生し、解決方法がわかりません。これがコードです:
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ステートメント内)と関係があると思いましたが、よくわかりません。どんな助けでも大歓迎です。
おかげで、
マット
私の推測では
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
tは文字列ではありませんか?
tはTask
型ですが、ストアドプロシージャに渡すときはnvarchar
として渡します。
これがあなたのコードです:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
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;
_
行:
_myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
_
タスクの名前に_t.Name
_またはt.ToString()
を渡す必要があると思います(わかりません)。
問題はこの行にあると思います:
_myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
_
tは文字列に変換できません。あなたはt.Name or t.ToString()
を試すことができます(私の頭の上からそのクラスで利用できるプロパティはわかりません)。
TはTaskのタイプであり、文字列に変換してみてください。t.GetType().Name
または実際のタスク名をここに入力する必要があります。オブジェクトをパラメーターとして渡すことができないため、既知のsqltypeのみがタイプです。
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
t
はTask
であり、文字列ではありません。これはおそらくname
になるはずです。
ライン上:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
't'は文字列ではなくタスクです。代わりにタスク名を取得する必要があります(その外観から)
問題はこの行にあります:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
タスクの名前の代わりにタスクオブジェクトを渡しています。