Ответ 1
Я предполагаю, что в
myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;
t не является строкой?
Я получаю сообщение об ошибке в своем приложении, и я не могу понять, как его решить. Вот код:
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
Я предполагаю, что в
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 - это тип задачи, и и ado попробуйте преобразовать его в строку
вы должны положить t.GetType().Name
или имя реальной задачи здесь
потому что мы не можем передавать объекты в качестве параметра, единственный тип которого известен sqltypes
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;
Вы передаете объект задачи вместо имени задачи.