Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
Invalid column name 'XmlId' в инфоблоках ASP.NET 1С-Битрикс
Была такая проблема у версии 5.0 1С-Битрикс ASP.NET, если не ошибаюсь. В более поздних обновлениях должны были исправить, но я, если честно не знаю, ибо поправил проблему самостоятельно руками.

В общем, проблема проявляется так - заходим из админки в инфоблок (любой) - выдаёт ошибку:
Код
Server Error in '/' Application.
Invalid column name 'XmlId'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'XmlId'.

Source Error:

Line 73:             typeId = iblock.TypeId;
Line 74:             hfTypeId.Value = typeId.ToString();
Line 75:             type = BXIBlockType.GetById(typeId);
Line 76:             if (type == null)
Line 77:                 Response.Redirect("IBlockTypeList.aspx");


Source File: c:\inetpub\wwwroot\bitrixnet\web\bitrix\admin\IBlockListAdmin.aspx.cs    Line: 75

Stack Trace:

[SqlException (0x80131904): Invalid column name 'XmlId'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +212
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +245
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2811
   System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +58
   System.Data.SqlClient.SqlDataReader.get_MetaData() +112
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6281668
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6282737
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +424
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +28
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +211
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) +87
   Bitrix.DataLayer.BXSqlCommand.ExecuteReader(CommandBehavior behavior) +293
   Bitrix.DataLayer.BXEntity`3.ExecuteSql(String commandText, SqlParameter[] parameters, BXQueryParams queryParams, IBXTextEncoder textEncoder, BXSchemeBase scheme, IBXEntityValueMap valueMap) +416
   Bitrix.DataLayer.BXEntity`3.GetListInternal(BXFilter filter, BXOrderBy orderBy, BXSelect select, BXQueryParams queryParams, IBXTextEncoder textEncoder, BXSchemeBase scheme) +1274
   Bitrix.DataLayer.BXEntity`3.GetByIdInternal(Object id, IBXTextEncoder textEncoder, BXSchemeBase scheme) +589
   Bitrix.DataLayer.BXEntity`3.GetByIdInternal(Object id, IBXTextEncoder textEncoder) +16
   Bitrix.DataLayer.BXEntity`3.GetById(Object id) +113
   bitrix_admin_IBlockListAdmin.InitPage() in c:\inetpub\wwwroot\bitrixnet\web\bitrix\admin\IBlockListAdmin.aspx.cs:75
   bitrix_admin_IBlockListAdmin.GridView1_GetSettingsQueryString(Object sender, BXGridViewGetSettingsQueryStringEventArgs e) in c:\inetpub\wwwroot\bitrixnet\web\bitrix\admin\IBlockListAdmin.aspx.cs:188
   Bitrix.UI.BXGridView.ResolveSettingsQueryString() +108
   Bitrix.UI.BXGridViewSettings.BuildProfileKey(BXGridView grid, String id) +61
   Bitrix.UI.BXGridView.TryUserSettings() +73
   Bitrix.UI.BXGridView.LoadUserSettings() +40
   Bitrix.UI.BXGridView.OnInit(EventArgs e) +627
   System.Web.UI.Control.InitRecursive(Control namingContainer) +143
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Control.InitRecursive(Control namingContainer) +391
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1477


Version Information: Microsoft .NET Framework Version:2.0.50727.4927; ASP.NET Version:2.0.50727.4927

При этом если Контент-менеджер зайдёт через публичную часть, "редактирование", и нажмёт на пиктограмме "добавить", то благополучно добавит новость... Т.е. проблема именно в админке.

Решается довольно просто с помощью следующего запроса к MS SQL базе данных:
Код
IF OBJECT_ID('dbo.b_IBlockType', 'U') IS NOT NULL
AND NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
   WHERE 
      TABLE_SCHEMA+'.' = 'dbo.' 
      AND TABLE_NAME='b_IBlockType' 
      AND COLUMN_NAME='XmlId' )
      
   ALTER TABLE dbo.b_IBlockType 
   ADD XmlId NVARCHAR(255)


Как говорится, счастье где-то близко!
Алексей, проблема прямых запросов к базе данных действительно актуальная в АСП.НЕТ битриксе. Мы не наблюдаем в настоящий момент тех проблем, о которых вы говорите, но зато и не знаем как сделать прямой запрос.
Не подскажете?
В пхп версии есть по крайней мере специальная страничка в настройках сайта, а в асп.нет как быть с этим?
ну мы для этого используем небольшой файлик, который запихали в /bitrix/admin/
Однако хотим предупредить, что это небезопасное решение - он проверяет только имеет ли юзер доступ к соответствующему файловому разделу. Контент-менеджер тоже может у вас пошалить...
Советую заливать по необходимости.

визуальное оформление SqlQuery.aspx:
Код
<%@ Page Language="C#" MasterPageFile="~/bitrix/admin/AdminMasterPage.master" AutoEventWireup="true" CodeFile="SqlQuery.aspx.cs" Inherits="bitrix_admin_SqlQuery" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
   <asp:TextBox ID="TextBox1" runat="server" Height="170px" TextMode="MultiLine" Width="100%"></asp:TextBox>
   <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
   &nbsp;
   <asp:GridView ID="GridView1" runat="server" Width="100%">
   </asp:GridView>
   <% if (exception != null) { %>
   <br />
   <%= Bitrix.Services.Text.BXStringUtility.HtmlEncodeEx(exception) %>
   <% } %>
</asp:Content>


логика SqlQuery.aspx.cs:
Код
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Bitrix.UI;
using Bitrix.DataLayer;
using System.Data.SqlClient;
using Bitrix.Security;
using System.Collections.Generic;

public partial class bitrix_admin_SqlQuery : BXAdminPage
{
   protected string exception;

   public DataTable GetTable(BXSqlDataReader reader)
   {

      DataTable table = reader.GetSchemaTable();
      DataTable dt = new DataTable();
      DataColumn dc;
      DataRow row;
      List<KeyValuePair<string, string>> al = new List<KeyValuePair<string, string>>();

      for (int i = 0; i < table.Rows.Count; i++)
      {
         dc = new DataColumn();

         if (!dt.Columns.Contains(table.Rows[i]["ColumnName"].ToString()))
         {

            dc.ColumnName = table.Rows[i]["ColumnName"].ToString();
            dc.Unique = Convert.ToBoolean(table.Rows[i]["IsUnique"]);
            dc.AllowDBNull = Convert.ToBoolean(table.Rows[i]["AllowDBNull"]);
            dc.ReadOnly = Convert.ToBoolean(table.Rows[i]["IsReadOnly"]);
            dt.Columns.Add(dc);
            al.Add(new KeyValuePair<string,string>(table.Rows[i]["ColumnName"].ToString(), dc.ColumnName));
         }
      }

      while (reader.Read())
      {
         row = dt.NewRow();
         for (int i = 0; i < al.Count; i++)
            row[al[i].Value] = reader[al[i].Key];
         dt.Rows.Add(row);
      }
      return dt;
   }
   
   protected void Page_Init(object sender, EventArgs e)
   {
      if (!BXUser.IsCanOperate(BXRoleOperation.Operations.ProductSettingsManage))
         BXAuthentication.AuthenticationRequired();
   }
   protected void Button1_Click(object sender, EventArgs e)
   {
      try
      {
         DataTable t = null;
         using (BXSqlCommand cmd = new BXSqlCommand(TextBox1.Text))
         using (BXSqlDataReader data = cmd.ExecuteReader())
            t = GetTable(data);

         GridView1.DataSource = t;
         GridView1.DataBind();
      }
      catch(Exception ex)
      {
         exception = ex.ToString();
      }
   }
}


Заходите на страничку SqlQuery.aspx (для этого оба файла должны лежать в одной директории) и вводите в имеющееся окошко запрос.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
________________________________________________________________

Новости IT

Статьи

Форум

Композитный сайт

Битрикс24

Команда

Проекты, которым мы помогли

Если вам нужен сайт

a@coffeediz.ru

Готовые решения