Windows服务

时间:2015-10-07 21:02:03

标签: c# sql sql-server stored-procedures

我使用以下代码创建了一个Windows服务。不知道为什么它不会触发最后一个SQL Server存储过程。如果我在代码中没有任何内容,但存储过程比它触发正常。没有错误。

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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

要解决此问题(并且作为良好实践),您应该为每个SQL命令创建新连接,而不是重复使用相同的连接对象并在命令之间保持打开这么长时间。如果您需要确保将它们作为事务处理单元处理,请在新的TransactionScope()中将对此方法的调用包装起来