2015-09-07 7 views
-2

Я использую этот код для добавления записи в базу данных Client.accdb , но при попытке выполнить команду (если я открываю базу данных с помощью Microsoft Access, эта команда работает не так).OleDbCommand Failed

Моя Add функция выглядит следующим образом:

public static void AddClient(string ipAddress, string macAddrress, string machineName) 
{ 
    string command = "INSERT INTO tbl_Clients (ipAddress, macAddress, machineName) VALUES ('" + ipAddress +"', '" + macAddrress + "', '" + machineName + "')"; 
    OleDbConnection connection= new OleDbConnection(ConnectionStringStatic()); 
    OleDbCommand cmd = new OleDbCommand(command, connection); 
    try 
    { 
     connection.Open(); 
     OleDbDataReader dr = cmd.ExecuteReader(); // here it move to the catch..why ?? 
     while (dr.Read()) 
     { 
     }       
     dr.Close(); 
    } 
    catch (OleDbException ex) 
    { 
    } 
    catch (Exception ex)   
    { 
    } 
    finally 
    { 
     if (connection.State != ConnectionState.Closed) 
     { 
      connection.Close(); 
     } 
    } 
} 

Я почти такой же (только строка подключения и базы данных были разными) и там работала.

Почему это не работает?

+0

Что вы подразумеваете под нерабочим. Если вы получаете какое-либо исключение, напишите здесь? –

+0

Какая ошибка вы получаете? – Harsh

+0

У меня нет ошибки; он переместится в catch и не выполнит команду ... –

ответ

0

Необходимо выполнить запрос с помощью ExecuteNonQuery. ExecuteReader возвращает данные, которые не имеют значения с оператором INSERT.

Но, что более важно, вы всегда должны использовать parameterized queries. Этот тип конкатенаций строк открыт для атак SQL Injection.

Также используйте using statement, чтобы автоматически отключить ваше соединение и команду вместо вызова методов Close вручную.

using(var connection = new OleDbConnection(ConnectionStringStatic())) 
using(var cmd = connection.CreateCommand()) 
{ 
     cmd.CommandText = @"INSERT INTO tbl_Clients (ipAddress, macAddress, machineName) 
          VALUES (?, ?, ?)"; 
     cmd.Parameters.Add("@ip", ipAddress); 
     cmd.Parameters.Add("@mac", macAddrress); 
     cmd.Parameters.Add("@name", machineName); 
     connection.Open(); 
     cmd.ExecuteNonQuery(); 
} // <-- Both connection and command are disposed here 
+0

действительно ли она закроет базу данных после выполнения команды? –

+0

@ csharp.tester Если вы подключаетесь к _database_, то да. Этот тип вложенных операторов удаляет объекты 'connection' и' cmd' на '}' строке. –

+0

спасибо, что это работает! вы говорите, что мне нужно использовать ExecuteNonQuery из-за вставки, поэтому, если я хочу использовать select, мне нужно использовать ExecuteQuery? и как я могу прочитать данные? –

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