Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Строка, которую вы передали, не является допустимой строкой подключения к базе данных, это строка подключения EF , которая содержит строку подключения SQL Server в параметре provider connection string
. WebSecurity.InitializeDatabaseConnection ожидает действительную строку подключения к базе данных
Чтобы избежать разбора строки подключения самостоятельно, вы можете использовать класс EntityConnectionStringBuilder для синтаксического анализа строки и получения строки подключения к базе данных из ее Свойство ProviderConnectionString
Старое сообщение, но мое решение,
К сожалению, это не решило его для меня, используя Azure Functions, говорящий с отдельным проектом (библиотекой классов) с EDMX.
Мне пришлось отредактировать конструктор класса Context.CS, заменив
: base ("Entities")
на
: base (ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)
Надеюсь, это может помочь кому-то, кто в этом нуждается.
Я собираюсь выкинуть еще один ответ, на случай, если кто-то еще столкнется с этим через тот же странный сценарий, что и я.
Для начала, как говорили другие, строки подключения 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, и это то, что вам нужно, если вы используете одно и то же соединение в развертывание, как и в локальной разработке.
Вот код, который я использую, чтобы извлечь имя базы данных & 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"
Привет,
На мой взгляд, строка подключения для ADO.NET (в данном случае SqlConnection) не может использовать метаданные. Вы используете один для Entity Framework. ADO.NET должен выглядеть примерно так:
"data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True"
Итак, чтобы подвести итог, вам нужны две отдельные строки подключения: одна для EF и одна для ADO.NET.
blockquote>
Просто добавьте еще одну возможность (с которой я столкнулся) - это может быть так, если вы разрабатываете / поддерживаете Azure WebApp, используя строку соединения, сохраненную в настройках приложения Azure.
Рядом с каждым подключением строка в настройках приложения - это раскрывающийся список для типа строки подключения. Очень легко забыть установить это значение «Пользовательский» для значений платформы Entity Framework и оставить его по умолчанию (SQL Database), что также вызывает указанную выше ошибку.
Проверьте это место
<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)
Для Azure Web App тип строки подключения не имеет «System.Data.EntityClient» , Пользовательский режим работает хорошо.
Когда это произошло со мной, это произошло потому, что строка соединения имела:
providerName="System.Data.SqlClient"
, но она должна быть:
providerName="System.Data.EntityClient"
, потому что, как было сказано другим ответом, это строка подключения EF.