Исключение: ключевое слово не поддерживается: метаданные [дубликаты]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
40
задан Nikolai Samteladze 11 June 2015 в 02:28
поделиться

9 ответов

Строка, которую вы передали, не является допустимой строкой подключения к базе данных, это строка подключения EF , которая содержит строку подключения SQL Server в параметре provider connection string. WebSecurity.InitializeDatabaseConnection ожидает действительную строку подключения к базе данных

Чтобы избежать разбора строки подключения самостоятельно, вы можете использовать класс EntityConnectionStringBuilder для синтаксического анализа строки и получения строки подключения к базе данных из ее Свойство ProviderConnectionString

53
ответ дан Panagiotis Kanavos 18 August 2018 в 00:15
поделиться
  • 1
    Понимаю. Поэтому после того, как я последовал примеру, скажем отсюда: msdn.microsoft.com/en-us/library/… . Нужно ли поддерживать строку подключения в файле web.config или я могу избавиться от нее? Благодаря! – ASPCoder1450 25 November 2013 в 18:30
  • 2
    Возможно, строка подключения EF хорошо работает на моем ящике, но не на Azure – Manuel Hernandez 23 October 2014 в 07:20
  • 3
    & quot; Не на Azure & quot; не говорит много. Типы строк подключения не имеют ничего общего с окружающей средой. Если они не работают в разных средах, когда код один и тот же, это потому, что они указывают на серверы, которые не существуют в одном окружении, или используют недопустимые учетные данные для этой среды. Задайте вопрос своей проблемой. – Panagiotis Kanavos 23 October 2014 в 07:47

Старое сообщение, но мое решение,

К сожалению, это не решило его для меня, используя Azure Functions, говорящий с отдельным проектом (библиотекой классов) с EDMX.

Мне пришлось отредактировать конструктор класса Context.CS, заменив

: base ("Entities")

на

: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)

Надеюсь, это может помочь кому-то, кто в этом нуждается.

-1
ответ дан Ele 18 August 2018 в 00:15
поделиться

Я собираюсь выкинуть еще один ответ, на случай, если кто-то еще столкнется с этим через тот же странный сценарий, что и я.

Для начала, как говорили другие, строки подключения ADO и Строки соединения EF различны.

Строка соединения ADO содержит несколько разделенных точкой с запятой полей, которые могут очень сильно отличаться от одного типа подключения к другому, но обычно вы видите «источник данных = xxx», «начальный каталог» = yyy "и т. д. Вы будете not см.« metadata = zzz ».

Строка соединения EF имеет одинаковую структуру, но имеет« metadata = zzz »и «connection connection string = www», где «www» - это строка с экранированным кодом ADO.

Таким образом, нормальный формат для строки соединения ADO:

data source=myserver;
initial catalog=mydatabase;
Persist Security Info=True;
User ID=myusername;
Password=mypassword;
MultipleActiveResultSets=True

В то время как обычный формат для строки подключения EF:

metadata=res://*/MyDbContext.csdl|
    res://*/MyDbContext.ssdl|
    res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string="
    data source=myserver;
    initial catalog=mydatabase;
    Persist Security Info=True;
    User ID=myusername;
    Password=mypassword;
    MultipleActiveResultSets=True;
    application name=EntityFramework
    "

Большинство людей, которые сталкиваются с этой проблемой, похоже, вырезали строку подключения EF и вставляли ее в место, где требовалась строка соединения ADO. В сущности, я сделал то же самое, но процесс был не таким ясным, как все это.

В моем случае у меня было веб-приложение, которое использовало EF, поэтому его web.config правильно содержал EF-соединение Строки.

Я опубликовал пакет развертывания, и процесс предложит вам строки подключения, которые будут использоваться при развертывании. Они хранятся в файле SetParameters.xml пакета развертывания.

Я вырезал и вставил строки подключения EF в поля ввода диалога публикации.

Я развернул веб-приложение, попытался получить доступ к нему и получить ошибку «Неиспользуемые ключевые слова: метаданные».

То, что я не понял, заключается в том, что средство публикации MS ожидало строку соединения ADO, и, учитывая это, она построила бы строку соединения EF .

В результате у SetParameters.xml и моего развернутого web.config были строки подключения, которые выглядели следующим образом:

metadata=res://*/MyDbContext.csdl|
    res://*/MyDbContext.ssdl|
    res://*/MyDbContext.msl;
provider=System.Data.SqlClient;
provider connection string="
    metadata=res://*/XxDbContext.csdl|
        res://*/XxDbContext.ssdl|
        res://*/XxDbContext.msl;
    provider=System.Data.SqlClient;
    provider connection string="
        data source=myserver;
        initial catalog=mydatabase;
        Persist Security Info=True;
        User ID=myusername;
        Password=mypassword;
        MultipleActiveResultSets=True;
        application name=EntityFramework
        "
    ""

Другими словами, строка подключения встроенного поставщика была EF, а не строку соединения ADO, поэтому, когда EF попытался использовать ее для подключения к базе данных, она сгенерировала эту ошибку.

Другими словами, когда вы вставляете строки подключения в диалоги публикации , вам нужно вставить строку соединения ADO, а не строку соединения EF, даже если то, что у вас есть в web.config, вы c opying from - это строка подключения EF.

Вы можете извлечь строку соединения ADO из поля строки подключения поставщика строки подключения EF, и это то, что вам нужно, если вы используете одно и то же соединение в развертывание, как и в локальной разработке.

2
ответ дан Jeff Dege 18 August 2018 в 00:15
поделиться
  • 1
    Я должен был прочитать этот ответ несколько раз, чтобы это имело смысл, но после нескольких часов царапин на голове и «Ключевое слово не поддерживается». типа, ваши примеры строк подключения, наконец, устранили мою проблему. Красиво сделано. – Mike Gledhill 1 February 2018 в 14:11

Вот код, который я использую, чтобы извлечь имя базы данных & amp; имя сервера из строки подключения.

Обратите внимание, как он проверяет, является ли это соединительной строкой Entity Framework, и если это так, он извлекает часть «строки подключения поставщика», которая затем может быть передана в SqlConnectionStringBuilder:

Если я не сделал это, я получил бы эту неприятную ошибку «Keyword Not Supported: Metadata».

if (connectionString.ToLower().StartsWith("metadata="))
{
    System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(connectionString);
    connectionString = efBuilder.ProviderConnectionString;
}

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
DatabaseServer = builder.DataSource;             //  eg "MikesServer"
DatabaseName = builder.InitialCatalog;           //  eg "Northwind"
1
ответ дан Mike Gledhill 18 August 2018 в 00:15
поделиться

Привет,

На мой взгляд, строка подключения для ADO.NET (в данном случае SqlConnection) не может использовать метаданные. Вы используете один для Entity Framework. ADO.NET должен выглядеть примерно так:

"data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True"

Итак, чтобы подвести итог, вам нужны две отдельные строки подключения: одна для EF и одна для ADO.NET.

Souce: http://forums.iis.net/post/2097280.aspx

0
ответ дан Muhammad Rehan Qadri 18 August 2018 в 00:15
поделиться

Просто добавьте еще одну возможность (с которой я столкнулся) - это может быть так, если вы разрабатываете / поддерживаете Azure WebApp, используя строку соединения, сохраненную в настройках приложения Azure.

Рядом с каждым подключением строка в настройках приложения - это раскрывающийся список для типа строки подключения. Очень легко забыть установить это значение «Пользовательский» для значений платформы Entity Framework и оставить его по умолчанию (SQL Database), что также вызывает указанную выше ошибку.

16
ответ дан oflahero 18 August 2018 в 00:15
поделиться
  • 1
    это также устранило проблему с ключевыми словами метаданных, но теперь у меня нет ключевого слова: обновление «server»: has & amp; quot; перед сервером, переключается на одинарные кавычки, и все работает сейчас. спасибо – Mr. Kraus 8 April 2016 в 22:00

Проверьте это место

<add name="ConnectionString" connectionString="Data Source=SMITH;Initial Catalog=db_ISMT;Persist Security Info=True;User ID=sa;Password=@darksoul45;MultipleActiveResultSets=True;Application Name=EntityFramework"
  providerName="System.Data.SqlClient" />

Как вы видите, есть две строки подключения для ADO, а другая для системы входа в систему или что угодно. В моем случае ConnectionString для системы входа, поэтому я использовал это в: -

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
    SqlCommand cmd = null;
    SqlDataReader dr = null;
    protected void Page_Load(object sender, EventArgs e)

0
ответ дан Rabi Shrestha 18 August 2018 в 00:15
поделиться

Для Azure Web App тип строки подключения не имеет «System.Data.EntityClient» , Пользовательский режим работает хорошо.

0
ответ дан Song 18 August 2018 в 00:15
поделиться
  • 1
    Когда я это делаю, я получаю сообщение об ошибке «Строка подключения« myConnection »в файле конфигурации приложения не содержит требуемого атрибута providerName. & Quot; ... как вы добавляете имя провайдера в настройках лазурной функции? Вы сделали другие настройки рядом с этим? – batmaci 8 January 2018 в 12:17

Когда это произошло со мной, это произошло потому, что строка соединения имела:

providerName="System.Data.SqlClient"

, но она должна быть:

providerName="System.Data.EntityClient"

, потому что, как было сказано другим ответом, это строка подключения EF.

44
ответ дан Will Newton 18 August 2018 в 00:15
поделиться
  • 1
    Это может быть очень сложно отследить, просто, когда вы знаете – jolySoft 30 June 2015 в 15:30
  • 2
    Вау ... это спасло меня от сумасшедшего после часа, ища решения !! Почему это не автоматически обновляется при установке EF? +1 – jom 2 January 2018 в 21:41
Другие вопросы по тегам:

Похожие вопросы: