arave0521 Ответов: 2

проблема executenonquery в c#.net


У меня возникли проблемы с выполнением sql-оператора без запроса. Имейте в виду, что я все еще новичок в .NET framework и MySQL. Вот мой код.

private void Binding()
{
    string connStr = "datasource=localhost;port=3306;username=root;password=root;";
    conn = new MySqlConnection(connStr);
    MySqlCommand command = conn.CreateCommand();
    try
    {
        string database = schemaForm.getData;
        dtable = new DataTable();
        bindingSource = new BindingSource(); ;

            conn.Open();
            command.CommandText = "SELECT Metabolite_Name" +
                                  "FROM " + database +
                                  ".Metabolites WHERE"+
                                  " MetaboliteID IN ('met1', 'met2');";
            command.ExecuteNonQuery();
            sqlData.SelectCommand = command;
            sqlData.Fill(dtable);
            bindingSource.DataSource = dtable;
            dbMetName.DataSource = dtable;
            dtable.Columns.Add("Metabolite Name");
            dbMetName.DataSource = dtable;
            conn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


Передача значения из формы getData
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;

namespace DynamicSimulator_v2
{
    public partial class SchemaName : Form
    {
        private static string data;
        public SchemaName()
        {
            InitializeComponent();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            data=txtDB.Text;
            this.Hide();
        }

        public string getData
        {
            set
            {
                data = txtDB.Text;
            }
            get
            {
              return data;
            }
        }
    }
}


Ошибка показывает, что мой запрос неверен. Я почти уверен, что запрос был правильным, когда я тестировал его на MySQL script. Кстати, я стараюсь показать его в datagridview. dbMetName-это datagridview.

2 Ответов

Рейтинг:
15

Ranjan.D

Цитата:
команда.Метод executenonquery();

используется для вставки/обновления

Вы должны использовать ExecuteReader и загрузить данные в DataTable и, наконец, привязать к Grid.

SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.Значение closeconnection);
DataTable dt = новый DataTable();
ДТ.Нагрузки(др);


arave0521

Если я использую ExecuteReader, могу ли я вставлять и редактировать данные во время выполнения? Можете ли вы показать его на основе моего кода? Я все еще не понимаю. Спасибо

Ranjan.D

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

Вот модифицированный код

частный недействительными привязки()
{
строки string connStr = "источник данных=localhost;для порта=3306;имя пользователя=root;пароль=корень;";
conn = new MySqlConnection(connStr);
MySqlCommand command = conn.CreateCommand();
пробовать
{
строки базе = schemaForm.метода GetData;
dtable = новый DataTable();

Коннектикут.Открыть();
команда.CommandText = "SELECT Metabolite_Name" +
"Из" + база данных +
".Метаболиты где"+
"MetaboliteID IN ('met1', 'met2');";
SqlDataReader dr = команда.ExecuteReader(CommandBehavior.Значение closeconnection);
dtable.Нагрузка(dr);
dbMetName.Источник данных = dtable;
Коннектикут.Закрывать();
}
поймать (исключение бывший)
{
Ящик для сообщений.Показать(напр.сообщение);
}
}

arave0521

код по-прежнему есть проблема с SQL-команды. Я почти уверен, что вопрос был правильным.

Ranjan.D

Я немного изменил код.. Попробовать теперь.. Также поставьте точку останова и проверьте, заполняется ли datatable.

arave0521

База данных была заполнена. Я проверил его в Mysql workbench. Когда я запускаю модифицированный код, он говорит, что ошибка в синтаксисе SQL рядом с '.Metabolites, где MetaboliteID IN ('met1', 'met2');

Ranjan.D

Я думаю , что проблема заключается в названии таблицы - .Metabolites, Пожалуйста, удалите точку (.) или убедитесь, что имя таблицы правильное. Кроме того, вы можете поместить точку останова в команду.CommandText , сделайте одноступенчатую отладку , нажав клавишу F11, затем скопируйте sql-запрос и выполните то же самое в MySql bench , уверенный, что вы будете знать, в чем проблема.

arave0521

Вот файл проекта, в котором я застрял
https://www.dropbox.com/s/c8z58opqorplom6/DynamicSimulator_v2.zip

Ranjan.D

Вот модифицированный код.

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

частный недействительными привязки()
{
string connStr = строка.Формат("источник данных=localhost;для базы данных={0};порт=3306;имя пользователя=root;password=пароль пользователя root;", schemaForm.метода GetData);
пробовать
{
использование (conn = new MySqlConnection(connStr))
{
MySqlCommand command = conn.CreateCommand();
dtable = новый DataTable();
bindingSource = новый BindingSource(); ;
Коннектикут.Открыть();
команда.CommandText = "SELECT Metabolite_Name FROM" +
"Продукты метаболизма " +
"Где MetaboliteID IN ('met1', 'met2');";
MySqlDataReader dr = команда.Метода executereader();
dtable.Нагрузка(dr);
dbMetName.Источник данных = dtable;
}
}
поймать (исключение бывший)
{
Ящик для сообщений.Показать(напр.сообщение);
}
}

arave0521

Код уже работает! только вопрос расположения в command.commandText. Спасибо за помощь. Я ценю это!

Ranjan.D

Ахх забыл удалить еще одну строку кода которая не требуется

bindingSource = новый BindingSource(); ;

Рейтинг:
1

Member 14344246

публичный частичный вход в класс : форма
{
SqlConnection con = new SqlConnection(@"источник данных=.\SQLEXPRESS;начальный каталог=Library_management_system;Интегрированная безопасность=True;экземпляр пользователя=True");
int count = 0;
публичный вход в систему()
{
метод InitializeComponent();
}

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
SqlCommand cmd=con.CreateCommand();
УМК.Свойство Commandtype = Значение Commandtype.Текст;
УМК.Свойства commandtext = "выбрать * из Library_person где usernaem='"+текстовое поле textbox1.Текст+"' и пароль='"+поле textbox2.Текст+"'";

УМК.Метод executenonquery();
DataTable dt = новый DataTable();
SqlDataAdapter da = новый SqlDataAdapter(cmd);
да.Заполнить(ДТ);
count=конвертировать.ToInt32(dt.Rows.Рассчитывать.Метод toString());
if(count==0)
{
Ящик для сообщений.Показать("имя пользователя пароль не совпадает");
}
еще
{

этот.Скрыть();
mdi_user му = новый mdi_user();
мю.Покажите();
}
}

частная Login_Load недействительным(объект отправителя, EventArgs в электронной)
{
if(con.State==ConnectionState.Открыть)
{
против.Закрывать();
}
против.Открыть();

}
}



CHill60

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