#c# #sql #sql-server #sql-insert
#c# #sql #sql-сервер #sql-вставка
Вопрос:
У меня есть выпадающий список (со списком) в программе на C #, которую я пишу. — Он извлекает свои данные из таблицы в моей базе данных:
Application_Id | Application
---------------|--------------
1 |Name1
2 |Name2
3 |Name3
Код выпадающего списка выглядит следующим образом:
SqlConnection conn = new SqlConnection(SqlCon.DBCON);
conn.Open();
SqlCommand sc = new SqlCommand("select * from Application", conn);
SqlDataReader reader;
reader = sc.ExecuteReader();
DataTable dt = new DataTable();
dt.Columns.Add("ApplicationId", typeof(int));
dt.Columns.Add("Application_Name", typeof(string));
dt.Load(reader);
App.ValueMember = "ApplicationId";
App.DisplayMember = "Application_Name";
App.DataSource = dt;
conn.Close();
По сути, пользователь выбирает имя приложения и нажимает кнопку «Вставить».
Я хочу, чтобы это затем отправляло соответствующий идентификатор этого приложения в другую таблицу в моей базе данных. (Таблица учетных записей).
-У меня была эта настройка в качестве отношения первичного внешнего ключа, но для проверки я удалил это отношение.
Мой код для вставки в базу данных таков:
SqlConnection conn = new SqlConnection(SqlCon.DBCON);
conn.Open();
using (SqlCommand AQuery = conn.CreateCommand())
{
AQuery.CommandText = "INSERT INTO Accounts(AccountName,Application_Id,num_Users) VALUES(@param1,@param2,@param3)";
AQuery.Parameters.Add(new SqlParameter("@param1", account.Text));
AQuery.Parameters.Add(new SqlParameter("@param2", App.ValueMember));
AQuery.Parameters.Add(new SqlParameter("@param3", users.Text));
AQuery.ExecuteNonQuery();
}
Моя проблема в том, что при нажатии Insert возникает исключение. (Все компилируется)
Исключение гласит:
Ошибка преобразования не удалась при преобразовании значения nvarchar ‘applicationId’ в тип данных int.
-Я пробовал: ПРЕОБРАЗОВАНИЕ ПРИВЕДЕНИЯ
Преобразование valuemember в int в приложении перед инструкцией insert, все та же ошибка.
Что я делаю не так? — Он не пытается преобразовать фактическую строку ‘ValueMember’ в int, не так ли??
Комментарии:
1. Какой тип данных является applicationId в SQL Server?
Ответ №1:
Я думаю, вам нужно SelectedValue для извлечения выбранного значения из поля со списком, поэтому:
App.SelectedValue
Свойство SelectedValue: возвращает или задает значение свойства member, указанного свойством ValueMember.
Вы можете установить точку останова при получении значения, чтобы проверить, что возвращается, чтобы убедиться, что это число.
Комментарии:
1. Красивые. Быстрый ответ, который сработал. -Моя вина, но спасибо!
Ответ №2:
Параметр должен быть инициализирован с помощью
AQuery.Parameters.Add(new SqlParameter("@param2", Convert.ToInt32(App.SelectedValue)));
В вашем коде ValueMember
вместо значения используется свойство, которое является именем столбца (строкой). Однако следует добавить небольшую проверку ошибок, чтобы убедиться, что что-то выбрано в поле со списком
if(app.SelectedValue == null)
{
MessageBox.Show("Select an app");
return;
}
В качестве дополнительного примечания, при чтении значений для списка со списком я предлагаю использовать только поля, необходимые для заполнения списка со списком, вместо загрузки всех полей, а затем вручную создавать таблицу данных только с двумя столбцами
using(SqlConnection conn = new SqlConnection(SqlCon.DBCON))
using(SqlCommand sc = new SqlCommand(@"select ApplicationId, Application_Name
from Application", conn))
{
conn.Open();
using(SqlDataReader reader = sc.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
.....