【问题标题】:Stored Procedure does not fire in Windows Service存储过程不会在 Windows 服务中触发
【发布时间】:2015-10-07 21:02:02
【问题描述】:

我用下面的代码创建了一个 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();
    }
}

【问题讨论】:

  • 将您命名为 connecion SqlConnection 不是一个好主意。您是否在try / catch 中获得此代码?
  • 在您的第一次通话中,您将SqlCommand命名为cmdCreateINHResponseTableSP ,但在您使用cmdCreateITableSP的 using 块内
  • 所以你所有的“其他代码”都有错误。你应该找到它。一目了然,因为您正在导入文件,我想存在一些数据质量问题。你的windows服务崩溃了吗?您应该捕获错误并将它们写入 Windows 事件日志。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2013-08-15
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多