2015-10-07 55 views
0

火我创建一个Windows服务,下面这段代码。不知道为什么它不会触发最后的SQL Server存储过程。如果我在代码中没有任何内容,但是存储过程比它启动正常。没有错误。存储过程无法在Windows服务

using (SqlConnection SqlConnection = new SqlConnection(connectionString)) 
{ 
    SqlConnection.Open(); 

    using (SqlCommand cmdCreateITableSP = new SqlCommand("CreateSP", SqlConnection)) 
    { 
     cmdCreateITableSP.CommandType = CommandType.StoredProcedure; 
     cmdCreateTableSP.ExecuteNonQuery(); 
    } 

    string INTable = "IN"; 
    string XMLPackagesDir = "D:\\Cle\\"; 

    // Create a datatable with two columns: 
    DataTable INHReponseDT = new DataTable("INHReponseDT"); 

    // Create Columns: 
    INHReponseDT.Columns.Add("XM"); 
    INHReponseDT.Columns.Add("Cl"); 
    INHReponseDT.Columns.Add("I"); 
    INHReponseDT.Columns.Add("INH"); 
    INHReponseDT.Columns.Add("IN"); 

    DirectoryInfo DirInfo = new DirectoryInfo(XMLPackagesDir); 

    DataRow INHReponseRow = INHReponseDT.NewRow(); 

    foreach (FileInfo fi in DirInfo.GetFiles("*.*", SearchOption.AllDirectories)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Response)); 
     Response i; 
     FileStream fs = null; 
     fs = new FileStream(Path.Combine(XMLPackagesDir, fi.Name), FileMode.Open); 

     using (TextReader tr = new StreamReader(fs)) 
     { 
      i = (Response)serializer.Deserialize(tr); 
      INHReponseRow = INHReponseDT.NewRow(); 
      INHReponseRow["XM"] = fi.Name; 
      INHReponseRow["Cl"] = i.ClientCorrelationID; 
      INHReponseRow["I"] = i.StatusInformation.StatusItem.MessageText; 
      INHReponseRow["INH"] = i.ResponseStatus; 
      INHReponseRow["IN"] = i.RequestProcessedTime.ToString(); 

      INHReponseDT.Rows.Add(INHReponseRow); 
     } 

     //Insert into SQL Table 
     using (SqlBulkCopy s = new SqlBulkCopy(SqlConnection)) 
     { 

      s.DestinationTableName = INTable; 
      s.BatchSize = INHReponseDT.Rows.Count; 
      s.WriteToServer(INHReponseDT); 
      s.Close(); 
     } 
    } 

    using (SqlCommand cmdUpdateCaseInformationINHResponseSP = new SqlCommand("UpdateCaseSP", SqlConnection)) 
    { 
     cmdUpdateCaseInformationINHResponseSP.CommandType = CommandType.StoredProcedure; 
     cmdUpdateCaseInformationINHResponseSP.ExecuteNonQuery(); 
    } 
} 
+0

命名你connecion''SqlConnection的是不是一个好主意。你有'try/catch'这个代码吗? – Fred

+0

在您第一次叫你的名字''SqlCommand''cmdCreateINHResponseTableSP尚未使用使用块内'cmdCreateITableSP' – Fred

+0

所以在所有的“其他代码”的错误。你应该找到它。由于您正在导入文件,所以一眼就能看出存在一些数据质量问题。你的Windows服务崩溃了吗?您应该捕获错误并将它们写入Windows事件日志。 –

回答

0

我有一个similar issue与“额外的代码”在一些SQL命令的中间。虽然我无法立即看到它,但由于SQL命令之间包含的一些代码,确实出现了错误。用try catch包装这个可能有助于证明这一点。

要解决这个问题(和良好做法事),你应该为每个SQL命令,新的连接,而不是重复使用相同的连接对象,并把它打开了这么久命令之间。如果您需要确保他们作为一个成交单位处理,包裹调用此方法在新的TransactionScope()