首页 > 解决方案 > Web Deploy 上的“字符串或二进制数据将被截断”,而不是在调试模式下

问题描述

我有一个 ASP.Net 应用程序,它将 Excel 行传输到 SQL Server 表,然后它们由存储过程处理(TableA 数据被格式化为 TableB,然后 TableA 被截断)。
直接在 VS 环境中调试时,应用程序和存储过程都可以正常工作,但在 Web 部署中,我得到以下 SQL 异常:

字符串或二进制数据将被截断。
该语句已终止。

我已经将表模式更改为nvarchar(200)每一列,并ansi_warnings关闭了存储过程,但似乎没有任何影响该错误。同样,这只是在 web 部署上,这只会让我认为服务器端的用户权限(每个用户在 SQL 上登录为 NT AUTHORITY\NETWORK SERVICE)。

这是应用程序的 C# 端:

if (subeArchivo.HasFile)
{
    var fechaYMD = DateTime.Now.ToString("yyyyMMdd");
    var fechaHM = DateTime.Now.ToString("hhmm");

    string path = string.Concat(Server.MapPath("~/archivoCargado/" + fechaHM + "_" + fechaYMD + "_" + subeArchivo.FileName));
    subeArchivo.SaveAs(path);

    DataTable dt = ExcelToDataTable(subeArchivo.FileBytes, cbEncabezado.Checked);

    gridDT.DataSource = dt;
    gridDT.DataBind();

    try
    {
        string cadenaConn = ConfigurationManager.ConnectionStrings["cadenaSQL"].ConnectionString.ToString();

        SqlConnection conn = new SqlConnection(cadenaConn);
        SqlCommand cmd = new SqlCommand();
        SqlBulkCopy bulkcopy = new SqlBulkCopy(cadenaConn);

        SqlBulkCopyColumnMapping ID_USU_CAR = new SqlBulkCopyColumnMapping("ID_USU_CAR", "ID_USU_CAR");
        bulkcopy.ColumnMappings.Add(ID_USU_CAR);
        SqlBulkCopyColumnMapping RUT_DCT = new SqlBulkCopyColumnMapping("RUT_DCT", "RUT_DCT");
        bulkcopy.ColumnMappings.Add(RUT_DCT);
        SqlBulkCopyColumnMapping TIP_CON = new SqlBulkCopyColumnMapping("TIP_CON", "TIP_CON");
        bulkcopy.ColumnMappings.Add(TIP_CON);
        SqlBulkCopyColumnMapping ID_CON = new SqlBulkCopyColumnMapping("ID_CON", "ID_CON");
        bulkcopy.ColumnMappings.Add(ID_CON);
        SqlBulkCopyColumnMapping INI_BEN = new SqlBulkCopyColumnMapping("INI_BEN", "INI_BEN");
        bulkcopy.ColumnMappings.Add(INI_BEN);
        SqlBulkCopyColumnMapping FIN_BEN = new SqlBulkCopyColumnMapping("FIN_BEN", "FIN_BEN");
        bulkcopy.ColumnMappings.Add(FIN_BEN);
        SqlBulkCopyColumnMapping MON_CLP = new SqlBulkCopyColumnMapping("MON_CLP", "MON_CLP");
        bulkcopy.ColumnMappings.Add(MON_CLP);

        bulkcopy.DestinationTableName = "TMP_CAR_DCT_BEN";
        bulkcopy.WriteToServer(dt);

        lblCarga.Visible = true;
        lblCarga.Text = "CARGA A SQL COMPLETADA";

        lblSP.Visible = true;
        lblSP.Text = "EJECUTANDO VALIDACIONES";
        cmd.CommandText = "VAL_DCT_BEN_BETA2";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = conn;

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
        lblSP.Text = "VALIDACIÓN COMPLETADA";
    }
    catch (Exception ex)
    {
        lblConfirma.Text = ex.Message.ToString();
    }

    try
    {
        lblRes.Visible = true;

        connSQL.Open();

        // PROCESO RESUMEN
        SqlCommand selProc = connSQL.CreateCommand();
        SqlDataAdapter adaptadorDatos1 = new SqlDataAdapter(selProc);
        selProc.CommandText = "SELECT TOP 1 * FROM CON_PRO_BEN ORDER BY CAST(FEC_CAR AS DATETIME) DESC, HOR_CAR DESC";
        selProc.CommandType = CommandType.Text;
        DataTable tablaProcRes = new DataTable();
        adaptadorDatos1.Fill(tablaProcRes);

        gridProcRes.DataSource = tablaProcRes;
        gridProcRes.DataBind();
        gridProcRes.Visible = true;

        connSQL.Close();

        connSQL.Open();

        //  PROCESO DESCRIPTIVO
        SqlCommand selProcDes = connSQL.CreateCommand();
        SqlDataAdapter adaptadorDatos2 = new SqlDataAdapter(selProcDes);
        selProcDes.CommandText = "SELECT * FROM CON_PRO_BEN_DES " +
            "WHERE FEC_CAR = (SELECT MAX(FEC_CAR) FROM CON_PRO_BEN_DES) AND HOR_CAR = (SELECT MAX(HOR_CAR) FROM CON_PRO_BEN_DES) " +
            "ORDER BY HOR_CAR DESC";
        selProcDes.CommandType = CommandType.Text;
        DataTable tablaProcResDes = new DataTable();
        adaptadorDatos2.Fill(tablaProcResDes);

        gridProcDes.DataSource = tablaProcResDes;
        gridProcDes.DataBind();
        gridProcDes.Visible = true;

        connSQL.Close();
    }
    catch (Exception ex)
    {
        lblResQ.Text = ex.Message.ToString();
    }
}
else
    lblError.Visible = true;

lblError.Text = "Incidencias en la carga, reintentar.";

标签: c#sqlasp.netsql-server

解决方案


推荐阅读