2014-01-07 2 views
0

У меня есть простой запрос для обновления информации о пользователях, однако я получаю сообщение об ошибке, указывающее, что формат строки инициализации не соответствует спецификации по индексу 33, и кажется чтобы выделить этот конкретный код Connection.Close(); однако им не уверен, почему, вот полный код:формат строки инициализации не соответствует спецификации по индексу 33

public void AddNewUser() 
{ 
    string filePath; 
    try 
    { 
     filePath = (Application.StartupPath + ("\\" + DBFile)); 
     connection = new System.Data.OleDb.OleDbConnection((ConnectionString + filePath)); 
     connection.Open(); 
     System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(); 
     command.Connection = connection; 
     // ---set the user's particulars in the table--- 
     string sql = ("UPDATE enroll SET SSN=\'" 
         + (txtSSN.Text + ("\', " + ("FirstName=\'" 
         + (txtFirstName.Text + ("\', " + ("LastName=\'" 
         + (txtLastName.Text + ("\' " 
         + (" WHERE ID=" + _UserID)))))))))); 
     command.CommandText = sql; 
     command.ExecuteNonQuery(); 
     MessageBox.Show("Student added successfully!", "Registered"); 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error"); 
    } 
    finally 
    { 
     connection.Close(); 
    } 
} 

EDIT:

Вот файловые пути:

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Users\\Zack\\My Documents\\Test\\Database.mdb"; 

const string DBFile = "C:\\Users\\Zack\\My Documents\\Test\\Database.mdb"; 
+6

У вас есть уязвимость в SQL-инъекции. – SLaks

+2

Строка подключения sytnax неверна. Просмотрите: http: //stackoverflow.com/questions/8243008/format-of-the-initialization-string-does-not-conform-to-specification-starting-a или отправьте образец того, что оценивает 'filePath'. – Nico

+0

@Nico Я отредактировал вопрос и добавил пути к файлу – Zack

ответ

0

Ваш текст команды не так, и вы должны использовать parametirized запросы, вот правильная версия:

command.CommandText = "UPDATE enroll SET SSN= @ssn, FirstName = @fname, LastName = @lastName WHERE ID = @id"; 
command.Parameters.AddWithValue("@ssn", txtSSN.Text); 
command.Parameters.AddWithValue("@fname", txtFirstName.Text); 
command.Parameters.AddWithValue("@lastName", txtLastName.Text); 
command.Parameters.AddWithValue("@id", _UserID); 

И строка соединения:

string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Users\Zack\My Documents\Test\Database.mdb'"; 
+0

Я пробовал это, однако я получаю тот же код ошибки – Zack

+0

проверить строку подключения –

0

Zack,

Есть целый ряд вопросов, с этим кодом. Прежде всего, если вы должны были запустить это (в качестве состояний SLacks), вы открыты для SQL-инъекций. (Прочитайте об этом).

Во-первых, ваша строка соединения (на основе вашего кода) при запуске будет.

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Users\\Zack\\My Documents\\Test\\Database.mdb\\C:\\Users\\Zack\\My Documents\\Test\\bin\Debug\\C:\\Users\\Zack\\My Documents\\Test\\Database.mdb 

Ну, это догадка. Вы должны использовать следующее (обратите внимание, что ваш путь жестко закодирован).

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\""; 

const string DBFile = "Database.mdb"; 
//... 
var connection = new System.Data.OleDb.OleDbConnection(ConnectionString) 

Если вы хотите, чтобы ваша строка строки была динамической по пути, попробуйте это.

string conString = string.Format(ConnectionString, Path.Combine(Application.StartupPath, DBFile)); 
var connection = new System.Data.OleDb.OleDbConnection(conString); 

Это должно правильно установить строку подключения для запуска приложения. Теперь вам может показаться более полезным работать на пути сборки сборки, а не на запуск приложения (ваш вызов).

Следующие ваши вопросы беспорядок. Я очистил его, чтобы использовать параметризованные запросы вместо этого, в результате получился код somthing like. (обратите внимание, что это не было протестировано).

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\""; 

const string DBFile = "Database.mdb"; 
public void AddNewUser() 
{ 
    string conString = string.Format(ConnectionString, Path.Combine(Application.StartupPath, DBFile)); 
    using (var connection = new System.Data.OleDb.OleDbConnection(conString)) 
    { 
     try 
     { 
      string sql = "UPDATE enroll SET [email protected], [email protected], [email protected] WHERE [email protected]"; 
      System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sql, connection); 
      command.Parameters.AddWithValue("@ssn", txtSSN.Text); 
      command.Parameters.AddWithValue("@firstName", txtFirstName.Text); 
      command.Parameters.AddWithValue("@lastName", txtLastName.Text); 
      command.Parameters.AddWithValue("@userID", _UserID); 

      connection.Open(); 
      command.ExecuteNonQuery(); 
      MessageBox.Show("Student added successfully!", "Registered"); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString(), "Error"); 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 
} 

EDIT:

Я создал тестовую лабораторию для кода выше, и все побежали правильно. Дайте знать, если у вас появятся вопросы.

Cheers.

+0

Приветствия за помощь, я попробовал, но он выделяет «connection.Close();» и говорит, что исключение NullReferenceException было необработанным? – Zack

+0

@ Zack Вы уверены, что все ваши значения установлены? Если вы установите ваш отладчик в первой строке и проверьте каждую переменную.Также вы можете опубликовать полное сообщение об ошибке, включая stacktrace? Это точно скажет нам, в чем проблема. – Nico

+0

Я должен ссылаться на свой источник данных неправильно, потому что, когда я удаляю источник данных, он работает отлично на 100%, но как только я попытаюсь обратиться к моей базе данных к источнику данных строки соединения, я получаю те же ошибки – Zack

Смежные вопросы

 Смежные вопросы