【发布时间】:2011-09-06 07:14:11
【问题描述】:
我在我的应用程序中收到一个错误,我不知道如何解决它。代码如下:
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 语句中)有关,但我不确定。任何帮助将不胜感激。
谢谢,
马特
【问题讨论】:
-
我认为问题出在这一行 myCommand2.Parameters.Add("@TaskName", SqlDbType.NVarChar, 50).Value = t;如果您的班级有成员 Name 尝试添加为参数 t.Name。
-
@All - 令人惊讶的是,我们所有人都以如此之快的速度回答了这个问题。世界上有太多的C#程序员! ;)
-
别忘了给问题点赞 :)。 9 个回答,3 cmets 只有 1 票不对
-
哇。除了我,每个人都看到了那个。哈哈。
-
更多建议:(1)无需检查是否有行,如果没有返回行,while (reader.Read()) 将正确跳过。 (2) 我会使用 using 语句来封装那些 sql 命令和连接。在不处理那些非托管资源的情况下,您不希望发生任何类型的内存泄漏。
标签: c# sql stored-procedures