#c# #sql #ms-access
#c# #sql #ms-access
Вопрос:
Я пытаюсь установить простое подключение к базе данных MS Access с помощью объектов SqlConnection
and SqlCommand
.
Как вы можете видеть, вот как я устанавливаю соединение:
private SqlConnection GetConnection()
{
String connStr = ConfigurationManager.ConnectionStrings[0].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
return conn;
}
И прежде чем вы спросите, да, я пытался переместить этот фрагмент кода в метод, который его вызывает. Ничего не изменилось. Он по-прежнему неправильно считывает строку подключения.
Строка подключения выглядит следующим образом и находится в App.config
файле:
<add name="ConnString" connectionString="Server=*.*.*.*;Database=familie;User Id=mfs;Password=********;"/>
Но когда я получаю эту ошибку:
И посмотрите на объект строки подключения в то время, строка выглядит следующим образом:
"data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
Я потратил около 2 часов, пытаясь заставить это работать, заходя на множество разных сайтов, чтобы выяснить, что я сделал не так, но я либо получаю информацию, которая слишком старая, противоречивая, либо связана с подключением к локальной базе данных, когда на самом деле это внешний доступ через прокси, которыйбыло предоставлено мне моим клиентом (TrustGate, если кто-нибудь спросит)
Вызываемый метод GetConnection()
выглядит следующим образом:
public Dictionary<int,String> GetPostNrList()
{
SqlConnection conn = GetConnection();
SqlCommand cmd = new SqlCommand("Execute dbo.HENT_POST_NR_LISTE", conn);
var reader = cmd.ExecuteReader();
Dictionary<int, String> liste = new Dictionary<int, string>();
while (reader.NextResult())
{
int post_nr = (int) reader.GetSqlInt32(0);
String by = reader.GetString(1);
liste.Add(post_nr, by);
}
CloseConnection(conn);
return liste;
}
Что именно я делаю не так?
Комментарии:
1. Где оно находится в файле app.config?
Ответ №1:
Сообщение об исключении точно сообщает вам, в чем проблема — ваше соединение не открыто. Вам просто нужно открыть соединение перед выполнением команды:
conn.Open();
Кстати, хорошим шаблоном является использование using
блока при работе с SQL-соединениями, чтобы обеспечить его правильное удаление:
using (var conn = GetConnection())
{
using (var comm = xxxxxxx)
{
conn.Open();
using (var rdr = comm.ExecuteReader())
{
// xxxxx
}
}
}
Вам не нужно ничего специально закрывать — using
шаблон делает все это за вас.
Комментарии:
1. Я думал, что это похоже на Java, где он сам его открыл… это своего рода отсталость, если вы спросите меня. Но я приму ваш ответ, когда смогу.
2. Да, изначально мне показалось странным, что вам нужно специально открывать соединение, но я думаю, это для того, чтобы вы могли точно контролировать, как долго поддерживать соединение открытым, поскольку вы должны сделать это как можно короче.
3. @Vipar, хорошим finally блоком вокруг вызовов SQL является finally{ if(conn. Состояние == Состояние соединения. Открыть) conn. Close();} но! извините, не видел блок кода, он есть у него в using(), поэтому он будет удален, если вы не удалите его, тогда этот блок finally хорош в конце.