Вставить идентификатор в SQL из поля со списком C #

#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);
          .....