Как добавить данные из ListBox в базу данных SQL Server в формах C # Windows? - PullRequest
0 голосов
/ 20 января 2019

Я работаю над проектом, в котором пользователь получает набор лицензионных ключей и экспортирует его в текстовый файл. Затем информация отображается в списке, как показано ниже. Я использую C # и Windows Forms:

enter image description here

Кроме того, я хотел бы также сохранить данные из списка в локальной базе данных SQL Server для целей ведения записей в моем приложении. Я испробовал различные методы, которые я нашел в Интернете, чтобы сделать это, но все они оказались безуспешными.

Один из методов, которые я нашел, находится по этой ссылке:

https://www.youtube.com/watch?v=hUZGyA6UKGI&t=0s&index=26&list=PLZEMJ7iJtVdq9aMAiDfRlMoNrzGaWOfkZ

Вот код, который я использовал из видеоурка:

private void recordinserted(List<string>li)
{
        StringBuilder stringbi = new StringBuilder(string.Empty);

        foreach (string item in li)
        {
            const string qry = "Insert into [LicenseDB](Comapny Name, Software Name, LicenseKeys)values";
            stringbi.AppendFormat("{0}('{i}');",qry,item);
        }

        SqlConnection con = new SqlConnection();
        con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30");

        con.Open();

        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = stringbi.ToString();
        cmd.Connection = con;

        int a = cmd.ExecuteNonQuery();

        if (a > 0)
        {
            MessageBox.Show("inserted");
        }
}

// adding into local database (method placed in button click)
List<string> li = new List<string>();

foreach (ListViewItem item in lbGeneratedKeys.Items)
{
    if (item.Selected)
    {
        li.Add(item.Text);
    }

    recordinserted(li);
}

Я понял, что этот человек использует C # с ASP.Net и использует свойство ListITem, которого нет в Windows Form.

Другой метод, который я использовал, это классический SqlConnection метод:

//adding into local database
using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30"))
{
    con.Open();

    SqlCommand cmd = new SqlCommand("INSERT INTO LicenseDB (Company Name, Software Name, LicenseKeys,LicenseFileNo) VALUES (@cName, @sName, @lKeys, @lno)");
    cmd.CommandType = CommandType.Text;

    SqlDataReader dr = cmd.ExecuteReader();

    while (dr.Read())
    {
        lbGeneratedKeys.Items.Add(dr[0].ToString());
        lbGeneratedKeys.Items.Add(dr[1].ToString());
        lbGeneratedKeys.Items.Add(dr[2].ToString());
        lbGeneratedKeys.Items.Add(dr[3].ToString());
    }
}

Я использовал (dr[0].ToString()) для чтения каждой строки из списка для добавления в базу данных, где каждое число представляет строку в списке. Например. [0] представляет название компании в списке. Однако, когда я пытаюсь выполнить программу, возникает ошибка, указывающая, что строка SqlDataReader не инициализирована.

Кроме того, поскольку в моей программе есть алгоритм, позволяющий пользователям создавать более одного лицензионного ключа, мне также нужна помощь в том, как сгруппировать эти несколько строк сгенерированных лицензионных ключей в один столбец базы данных в таблице базы данных. Например, в моем пользовательском интерфейсе выше я решил создать 3 лицензионных ключа, и каждый лицензионный ключ занимает строку в ListBox. Я хотел бы сгруппировать эти три строки вместе, чтобы поместить их в одну переменную столбца базы данных (licenseKeys). Мне бы хотелось, чтобы алгоритм мог динамически считывать сгенерированные ключи, а также чтобы пользователь мог генерировать столько лицензионных ключей, сколько необходимо.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

Коды, которые я использовал:

 private void exportKey_Click(object sender, EventArgs e)
    {
        //adding into local database
        //excludes adding licensekeys
        SqlConnection sqlCon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30");
        sqlCon.Open();
        SqlCommand sqlCmd = new SqlCommand("addLicensedata", sqlCon);
        sqlCmd.CommandType = CommandType.StoredProcedure;

        sqlCmd.Parameters.AddWithValue(@"companyName", companyTextbox.Text.Trim());
        sqlCmd.Parameters.AddWithValue(@"softwareName", softwareTextbox.Text.Trim());
        sqlCmd.Parameters.AddWithValue(@"prodID", prodidTextbox.Text.Trim());
        sqlCmd.Parameters.AddWithValue(@"licenseType", cbLicensetype.Text.Trim());
        sqlCmd.Parameters.AddWithValue(@"LicenseNo", licensekeyNum.Text.Trim()); //no of license keys 

        sqlCmd.ExecuteNonQuery();
        //MessageBox.Show("Added to database");
        sqlCon.Close();

        if (cbLicensetype.SelectedItem.ToString() == "Trial")
        {
            sqlCmd.Parameters.AddWithValue(@"TrialDays", tbTrialdays.Text.Trim());
        }

        addtoFKtable();

private void addtoFKtable()
    {
        SqlConnection Con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\Database.mdf;Integrated Security=True;Connect Timeout=30");
        Con.Open();
        SqlCommand Cmd = new SqlCommand("addLicensekeys", Con);
        Cmd.CommandType = CommandType.StoredProcedure;

        Cmd.Parameters.AddWithValue(@"LicenseNo", licensekeyNum.Text.Trim());
        Cmd.Parameters.AddWithValue(@"LicenseKeys", lbHidden.Text.Trim());
        Cmd.Parameters.AddWithValue(@"prodID", prodidTextbox.Text.Trim());
        Cmd.Parameters.AddWithValue(@"companyName", companyTextbox.Text.Trim());
        Cmd.ExecuteNonQuery();
        //MessageBox.Show("Added license to database");
        Con.Close();
    }

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

0 голосов
/ 20 января 2019

Надеюсь, я понял вашу проблему:

Прежде всего, я думаю, очень важно определить вашу модель данных. Например, чтобы пользователь мог определить много ключей, я бы использовал другую таблицу, в которой все ключи были сохранены, после чего вам нужно определить, может ли один и тот же ключ быть связан с несколькими строками таблицы. «LicenseDB» (в таблице «LicenseDB» у вас есть столбцы «Название компании», «Название программного обеспечения», «LicenseFileNo»). В этом случае у вас будет отношение (n: n), а затем вам нужно будет создать другую промежуточную таблицу, которая определяет отношение между таблицей 'keys' и таблицей 'LicenseDB'. Если это не так, то вы просто определяете отношение между «ключами» и «LicenseDB» (n: 1), добавляя столбец licenseDbID к таблице «keys», который связывает множество ключей с одной строкой в ​​таблице «LicenseDB»

С другой стороны, проблема с вашим кодом заключается в том, что вы пытаетесь вставить данные, а не читать данные, поэтому вам не нужен DataReader, вместо этого вы просто можете реализовать что-то вроде этого:

using (SqlConnection con = new SqlConnection('YOUR STRING CONNECTION'))
     {
        con.Open();

        string comando = "INSERT INTO LicenseDB (companie, software) VALUES ('" + lbGeneratedKeys.Items[0].ToString() + "','" + lbGeneratedKeys.Items[1].ToString() + "')";
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = comando;

        cmd.Connection = con;

        cmd.ExecuteNonQuery();

     }

В этом случае два значения вставляются в таблицу LicenseDB - значения для имени компании и программного обеспечения.

Надеюсь, я тебе помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...