1

У меня есть следующий код на C#, для интерфейса с БД. Я ввожу значения в TextBoxes на интерфейсе. Нет ошибок, но при их выполнении данные не хранятся в базе данных, созданной с помощью Microsoft Access 2010. Здесь я дам полный код. Спасибо за ответы!Данные не хранятся в Access db с C# ad.InsertCommand

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.OleDb; 

namespace WindowsFormsApplication5 
{ 
    public partial class Form1 : Form 
    { 
     OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\lumi\\Desktop\\Test_DataB.accdb"); 
OleDbDataAdapter ad = new OleDbDataAdapter(); 
DataSet ds = new DataSet(); 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void indexBindingNavigatorSaveItem_Click(object sender, EventArgs e) 
     { 
      this.Validate(); 
      this.indexBindingSource.EndEdit(); 
      this.tableAdapterManager.UpdateAll(this.test_DataBDataSet); 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // TODO: This line of code loads data into the 'test_DataBDataSet.Index' table. You can move, or remove it, as needed. 
      this.indexTableAdapter.Fill(this.test_DataBDataSet.Index); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
       try 
    {  con.Open();    
      ad.InsertCommand = new OleDbCommand("Insert @Birth_month, @Firstname, @Surname, @ID", con); 
      ad.InsertCommand.Parameters.Add("@Birth_month", OleDbType.Numeric).Value = int.Parse(textBox1.Text); 
      ad.InsertCommand.Parameters.Add("@Firstname", OleDbType.VarChar).Value = textBox2.Text.ToString(); 
      ad.InsertCommand.Parameters.Add("@Surname", OleDbType.VarChar).Value = textBox3.Text.ToString(); 
      ad.InsertCommand.Parameters.Add("@ID", OleDbType.Numeric).Value = int.Parse(textBox4.Text); 
      ad.InsertCommand.ExecuteNonQuery(); 
      con.Close(); 
    } 


       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 


     } 
    } 
} 
+2

Что ..? Ваш OleDbCommand выглядит недействительным. o.O –

+0

Я перевел это, извините! – Lumi

ответ

1

Правильный синтаксис для команды INSERT является

INSERT INTO tablename VALUES(list of comma separated values or parameters) 

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

ad.InsertCommand = new OleDbCommand(@"Insert INTO table 
             VALUES (@Birth_month, @Firstname, @Surname, @ID)", con); 

И для этого запроса вы можете выйти из OleDbDataAdapter. Он не нужен

OleDbCommand cmd = new OleDbCommand(query, con); 
cmd.Parameters.AddWithValue(.....); 
.... 
cmd.ExecuteNonQuery(); 

Имейте в виду, что эта форма INSERT требует указания в качестве параметров каждого значения для полей в основной таблице в точном порядке определения. Если у вас меньше параметров, чем столбцы, то вам необходимо указать список столбцов перед ЗНАЧЕНИЕМ

INSERT INTO tablename (comma separated list of columns) VALUES (comma separated list of values) 

Кстати, это предпочтительный метод, чтобы следовать. В частности, это заставляет вас экранировать изменения схемы, такие как добавление нового столбца с нулевым значением, который разбивает первый оператор (тот, который не имеет списка столбцов)

0

Вы не можете параметризовать имена столбцов. Вы можете параметризовать значения .

Вот синтаксис INSERT (Transact-SQL)

INSERT 
{ 
     [ TOP (expression) [ PERCENT ] ] 
     [ INTO ] 
     { <object> | rowset_function_limited 
      [ WITH (<Table_Hint_Limited> [ ...n ]) ] 
     } 
    { 
     [ (column_list) ] 
     [ <OUTPUT Clause> ] 
     { VALUES ({ DEFAULT | NULL | expression } [ ,...n ]) [ ,...n  ] 
     | derived_table 
     | execute_statement 
     | <dml_table_source> 
     | DEFAULT VALUES 
     } 
    } 
} 

для Вашего случая;

INSERT INTO YourTableName VALUES(@Birth_month, @Firstname, @Surname, @ID) 

Следует добавить названия колонок, если они необходимы.

0

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

ad.InsertCommand = new OleDbCommand Insert into tablename (Birth_month,Firstname,Surname,id) values (@Birth_month, @Firstname, @Surname, @ID) 
ad.InsertCommand.Parameters.Add("@Birth_month", OleDbType.Numeric).Value = int.Parse(textBox1.Text); 
ad.InsertCommand.Parameters.Add("@Firstname", OleDbType.VarChar).Value = textBox2.Text.ToString(); 
ad.InsertCommand.Parameters.Add("@Surname", OleDbType.VarChar).Value = textBox3.Text.ToString(); 
ad.InsertCommand.Parameters.Add("@ID", OleDbType.Numeric).Value = int.Parse(textBox4.Text); 
ad.InsertCommand.ExecuteNonQuery(); 
con.Close(); 

Убедитесь строку соединения, как
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;

+0

Вставить синтаксическую ошибку – Lumi

0

Проблема: Ваше INSERT INTO утверждение не действует.

Синтаксис INSERT INTO высказыванием:

INSERT INTO [TableName]([col1],[col2],[coln]) values(@val1,@val2,@valn);

Решение: предполагая ваше имя таблицы UserInfo

con.Open();    
ad.InsertCommand = new OleDbCommand("INSERT INTO UserInfo values(@Birth_month, @Firstname, @Surname, @ID", con); 
ad.InsertCommand.Parameters.Add("@Birth_month", OleDbType.Numeric).Value = int.Parse(textBox1.Text); 
ad.InsertCommand.Parameters.Add("@Firstname", OleDbType.VarChar).Value = textBox2.Text.ToString(); 
ad.InsertCommand.Parameters.Add("@Surname", OleDbType.VarChar).Value = textBox3.Text.ToString(); 
ad.InsertCommand.Parameters.Add("@ID", OleDbType.Numeric).Value = int.Parse(textBox4.Text); 
ad.InsertCommand.ExecuteNonQuery(); 
con.Close(); 
0

попробовать этот код

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Data.OleDb; 

    namespace WindowsFormsApplication5 
    { 
     public partial class Form1 : Form 
     { 
      OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\lumi\\Desktop\\Test_DataB.accdb"); 
      OleDbDataAdapter ad = new OleDbDataAdapter(); 
      DataSet ds = new DataSet(); 


      public Form1() 
      { 
       InitializeComponent(); 
      } 

      private void indexBindingNavigatorSaveItem_Click(object sender, EventArgs e) 
      { 
       this.Validate(); 
       this.indexBindingSource.EndEdit(); 
       this.tableAdapterManager.UpdateAll(this.test_DataBDataSet); 

      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 
       // TODO: This line of code loads data into the 'test_DataBDataSet.Index' table. You can move, or remove it, as needed. 
       this.indexTableAdapter.Fill(this.test_DataBDataSet.Index); 

      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       try 
       { 

       con.Open(); 

        SqlCeCommand insert_command = new SqlCeCommand("Luna_nasterii,Nume,Prenume,Nr_fisa) " + "VALUES (@Luna_nasterii, @Nume, @Prenume, @Nr_fisa)", con); 

        insert_command.Parameters.AddWithValue("@Luna_nasterii", OleDbType.Numeric).Value = int.Parse(textBox1.Text); 
        insert_command.Parameters.AddWithValue("@Nume",OleDbType.VarChar).Value = textBox2.Text.ToString(); 
        insert_command.Parameters.AddWithValue("@Prenume", OleDbType.VarChar).Value = textBox3.Text.ToString(); 
        insert_command.Parameters.AddWithValue("@Nr_fisa", OleDbType.Numeric).Value = int.Parse(textBox4.Text); 


        create_adapt.InsertCommand = insert_command; 
        insert_command.ExecuteNonQuery(); 
        con.close(); 
       } 


       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 


      } 
     } 
    } 
+0

Ошибка: имя типа или пространства имен SqlCeCommand не найдено – Lumi

0

Inde ed, моя первая ошибка была синтаксисом инструкции INSERT, где я не обращал внимания. Но даже исправление, это не сработало. В базе данных не хранилось никаких данных. Проблема заключалась в том, что база данных доступа не была локализована в папке BIN проекта. Когда я переехал, все работало правильно. Спасибо всем за помощь!

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