Как добавить запись в SQL Server Compact - PullRequest
0 голосов
/ 26 сентября 2018

Я посмотрел много видео и ответов, в Интернете у меня теперь есть рабочий пример.

Я хочу перетащить файлы на панель и указать имя, которое я предоставляю, плюс путь к файлу.записано в базу данных.В некоторых примерах показано три строки для части SQL, которая у меня есть.

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO NStacks(NStacksName, NStacksItem)VALUES((textBox1.Text) + (File))", con); 

Другие имеют разные строки.

Когда программа выполняется нормально без запроса SQL, тогда строка

MessageBox.Show("Attempted write DB " + textBox1.Text +" "+ File);  

отобразит заданную информацию, которую следует ввести в базу данных.

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

«Произошла ошибка при разборе запроса.[Номер строки токена = 1, смещение строки токена = 72, Ошибка токена = Файл] ".

Мой код описан ниже.

namespace NStacks1
{
    public partial class Form1 : Form
    {
        SqlCeConnection con = new SqlCeConnection("Data Source=C:\\Users\\userename\\Documents\\Visual Studio 2010\\Projects\\NStacks1\\NStacks1\\NStacks.sdf");
        SqlCeCommand cmd;
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_DragDrop(object sender, DragEventArgs e)
        {
            if (textBox1.Text.Equals(""))
            {
                MessageBox.Show("Blank name please enter a name and try again.");
            }
            else
            {
                string[] Files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
                foreach (string File in Files)
                {
                    try
                    {
                        con.Open();
                        SqlCeCommand cmd = new SqlCeCommand("INSERT INTO NStacks(NStacksName, NStacksItem)VALUES((textBox1.Text) + (File))", con);
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("Attempted write DB " + textBox1.Text +" "+ File);
                        con.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        con.Close();
                    }
                }
            }
        }

        private void panel1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

INSERT INTO NStacks (NStacksName, NStacksItem) VALUES ((textBox1.Text) + (File))

Вы указываете БД на INSERT INTO таблицу NStacksVALUES "(textBox1.Text) + (File)" ТОЛЬКО в столбце NStacksName, так как вам не хватает запятой , для разделения значений.Вы не вставляете строку, вы вставляете несуществующие ключевые слова, создавая ошибку синтаксического анализа SQL.Вот как интерпретируется SQL (обратите внимание на красную линию покачивания):

bad sql

Строки в SQL должны быть заключены в одинарные кавычки ' как... VALUES ('value1', 'value2'), выглядит так:

enter image description here

Кроме того, вам необходимо очистить ваш SQL с помощью параметров!(ответ на PHP) , с C# это будет выглядеть так:

SqlCeCommand command = new SqlCeCommand("INSERT INTO NStacks(NStacksName, NStacksItem)VALUES(@NStacksName, @NStacksItem)", con);
command.Parameters.Add(new SqlCeParameter("NStacksName", textBox1.Text));
command.Parameters.Add(new SqlCeParameter("NStacksItem", File));
command.ExecuteNonQuery();

Или с классом соединения с БД:

using System;
using System.Data;
using System.Data.SqlServerCe;

namespace DataBase
{
    public class DBConnection
    {
        private SqlCeConnection sqlConnection;

        public DBConnection(string connectionString)
        {
            sqlConnection = new SqlCeConnection(connectionString);
        }

        private bool CloseConnection(SqlConnection sqlConnection)
        {
            try
            {
                sqlConnection.Close();
                return true;
            }
            catch (SqlException e)
            {
                //Handle exception
                return false;
            }
        }

        private bool OpenConnection(SqlConnection sqlConnection)
        {
            try
            {
                sqlConnection.Open();
                return true;
            }
            catch (SqlCeException e)
            {
                //Handle exception
                return false;
            }
        }

        public DataTable NonQuery(string sqlString, params SqlCeParameter[] sqlParameters)
        {
            DataTable table = new DataTable();
            table.Columns.Add(new DataColumn("Affected Rows", typeof(int)));
            if (this.OpenConnection(this.sqlConnection))
            {
                try
                {
                    SqlCeCommand sqlCommand = new SqlCeCommand(sqlString, this.sqlConnection);
                    sqlCommand.Parameters.AddRange(sqlParameters);

                    table.Rows.Add(sqlCommand.ExecuteNonQuery());
                }
                catch (SqlCeException e)
                {
                    table.Rows.Add(0);
                    //Handle exception
                }
                finally
                {
                    this.CloseConnection(this.sqlConnection);
                }
            }
            return table;
        }

        public DataTable Query(string sqlString, params SqlCeParameter[] sqlParameters)
        {
            DataTable table = new DataTable();
            if (this.OpenConnection(this.sqlConnection))
            {
                try
                {
                    SqlCeCommand sqlCommand = new SqlCeCommand(sqlString, this.sqlConnection);
                    sqlCommand.Parameters.AddRange(sqlParameters);

                    SqlCeDataAdapter sqlDataAdapter = new SqlCeDataAdapter(sqlCommand);
                    sqlDataAdapter.Fill(table);
                }
                catch (SqlCeException e)
                {
                    //Handle exception
                }
                finally
                {
                    this.CloseConnection(this.sqlConnection);
                }
            }
            return table;
        }
    }
}

И вызывать его следующим образом:

// Outside foreach loop (better make it a class field and initialize this
// inside the class constructor)
DBConnection db = new DBConnection(connectionString);

// Inside foreach loop
DataTable result = db.NonQuery("INSERT INTO NStacks(NStacksName, NStacksItem)VALUES(@NStacksName, @NStacksItem)",
    new SqlCeParameter("NStacksName", textBox1.Text),
    new SqlCeParameter("NStacksItem", File));
0 голосов
/ 26 сентября 2018

Я думаю, вы передаете один параметр, где требуется 2 параметра.вам нужно написать так

1002 *
...