Хранимая процедура С# с параметрами

182
20

Я получаю сообщение об ошибке в своем приложении, и я не могу понять, как его решить. Вот код:


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

спросил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
1
Решение
194

Я предполагаю, что в


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

t не является строкой?

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
140

t имеет тип Task, но когда вы передаете его в свою хранимую процедуру, вы передаете его как nvarchar.


Вот ваш код:

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

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
125

Предполагая, что ваша переменная 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;

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
117

В строке:


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

Я думаю, вам нужно передать t.Name или t.ToString() вверх по имени задачи (я этого не знаю).

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
109

T - это тип задачи, и и ado попробуйте преобразовать его в строку
вы должны положить t.GetType().Name или имя реальной задачи здесь
потому что мы не можем передавать объекты в качестве параметра, единственный тип которого известен sqltypes

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
110

Я думаю, проблема в этой строке:


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

t не может быть преобразован в строку. Вы можете попробовать t.Name or t.ToString() (не знаете, какие свойства доступны для этого класса с моей головы.)

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
100

В строке:


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

't' - задача, а не строка. Вам нужно вместо этого получить имя задачи (по внешнему виду)

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
98

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

t является Task не строкой. Вероятно, это должно быть на name.

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
100

Проблема в этой строке:


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

Вы передаете объект задачи вместо имени задачи.

ответил(а) 2021-01-25T15:36:59+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема