我在应用程序中收到错误,我无法弄清楚如何解决它。这是代码:
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语句中),但我不确定。任何帮助将不胜感激。
谢谢,
马特
答案 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.Name
或t.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;
t
是Task
而不是字符串。这应该是name
。
答案 7 :(得分:4)
在线:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
't'是一个任务,而不是一个字符串。您需要获取任务名称(通过它的外观)
答案 8 :(得分:4)
问题出在这一行:
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
您正在传递任务对象而不是任务名称。