2017-02-20 7 views
0

Я пытаюсь подключиться к файлу базы данных «crepeDB.accdb»Подключение доступа к базам данных

Когда я добавил его через соединение данных, и работает хорошо, когда я перетащить любой таблицы появляться в виде таблицы данных в любой форме, но когда я пытаюсь подключиться к базе данных, чтобы вставить данные, которые он дает мне эту ошибку:

An unhandled exception of type 'System.NotImplementedException' occurred in Additional information: The method or operation is not implemented.

код я использую следующим образом:

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); 
// TODO: Modify the connection string and include any 
// additional required properties for your database. 
conn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;"); 

conn.Open(); 
string query = "insert into Sales (Sdate,SQuantity) values ('" + dateTimePicker1.Value + "','" + textBox9.Text + "')"; 
OleDbCommand cmd = new OleDbCommand(query, conn); 
cmd.ExecuteNonQuery(); 

Это последнее, что мне нужно сделать в моем проекте, будет очень признателен за любую помощь.

+0

В какой строке? Какова трассировка стека в диалоговом окне исключения? –

+1

(Это должно быть переписано для использования параметризованной вставки, поскольку в настоящее время у вас есть уязвимость SQL Injection. Http://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database) –

+0

Да, давайте добавить ''); drop database; выберите * from sys_tables, где 'a' = ('a' в текстовом поле9: D – Icepickle

ответ

2

Не передавайте значения для полей, которые объединяют их, чтобы сформировать вашу команду, вместо этого используйте параметры.

int quantity; 
if(!Int32.TryParse(textBox9.Text, out quantity)) 
    MessageBox.Show("Invalid number"); 
else 
{ 
    using(OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;")) 
    {  
     conn.Open(); 
     string query = @"insert into Sales (Sdate,SQuantity) 
         values (@date, @qta)"; 
     OleDbCommand cmd = new OleDbCommand(query, conn); 
     cmd.Parameters.Add("@date", OleDbType.Date).Value = dateTimePicker1.Value; 
     cmd.Parameters.Add("@qta", OleDbType.Integer).Value = quantity; 
     cmd.ExecuteNonQuery(); 
    } 
} 

Это лучше, потому что вы не просите кого-то еще, чтобы преобразовать значения из строки в правильный тип данных. Это автоматическое преобразование (в частности, с датами) хорошо известно, чтобы вызвать проблемы, когда существует некоторая несоответствие между переданной строкой и как механизм базы данных интерпретирует эту строку

NB Я предполагаю, что Sdate является полем типа DateTime и SQuantity - это поле типа Integer в MS-Access. Если нет, вы можете изменить OleDbType Int32.TryParse на правильный тип соответствия

+0

Спасибо, Стив, я использовал ваш код, но он дает мне красную подчеркивание на OleDbConnection и добавляет, что дает подсказку «тип, используемый в использовании оператора, должен быть неявно конвертируемым в System.IDisposable» , а on Add it дает «объект делает не содержит определения для Add» –

+0

Эмм, а что ошибки вы получаете при попытке запустить программу (я имею в виду ошибки компилятора) – Steve

+0

Серьезность \t Код \t Описание \t Проект \t файла \t Line \t Подавление Государственный ошибка \t CS1674 \t ' OleDbConnection ': тип, используемый в операторе using, должен быть неявно конвертируемым в' System.IDisposable '\t CrepeCity \t C: \ Users \ Lymph47u5 \ Document s \ Visual Studio 2015 \ Projects \ CrepeCity \ CrepeCity \ frmCashier.CS Активного –

0

Это в основном так. , ,

con.Open(); 
SqlCommand cmd = new SqlCommand(@"insert into tbl_insert values(@name,@email,@add)", con); 
cmd.Parameters.AddWithValue("@name", txtname.Text); 
cmd.Parameters.AddWithValue("@email", txtemail.Text); 
cmd.Parameters.AddWithValue("@add", txtadd.Text); 
cmd.ExecuteNonQuery(); 
con.Close();