如何在 C# Windows 表单中将 ListBox 中的数据添加到 SQL 服务器数据库中?

How do I add data from ListBox into SQL Server database in C# Windows forms?

我正在开发一个项目,用户可以在其中生成一组许可证密钥并将其导出到文本文件中。然后信息显示在列表框中,如下所示。我正在使用 C# 和 Windows 形式:

除此之外,我还想将列表框中的详细信息保存到本地 SQL 服务器数据库中,以便在我的应用程序中保存记录。我已经尝试了我在网上找到的各种方法来做到这一点,但都没有成功。

我找到的方法之一来自这个 link:

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 并使用了 Windows Form 没有的 ListITem 属性。

我用的另一种方法是经典的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 行未初始化。

此外,由于我的程序具有供用户生成多个许可证密钥的算法,因此我还需要有关如何将这几行生成的许可证密钥分组以添加到数据库中的一个数据库列的帮助 table。例如在我上面的 UI 中,我选择生成 3 个许可证密钥,每个许可证密钥在列表框中占据一行,我想将这三行组合在一起放置在一个数据库列变量 (licenseKeys) 下.我希望该算法能够动态读取生成的密钥,并且用户可以根据需要生成尽可能多的许可证密钥。

希望我已经理解你的问题:

首先,我认为定义数据模型非常重要。例如,为了允许用户可以定义很多键,我会使用另一个 table 来存储所有键,之后你需要定义同一个键是否可以与多个键相关table 'LicenseDB' 上的行(在 table 'LicenseDB' 中,您将拥有公司名称、软件名称、LicenseFileNo 列)。如果是这样,您将拥有 (n:n) 关系,然后您需要构建另一个中间体 table 来定义 table 'keys' 和 table 之间的关系'LicenseDB'。如果不是这种情况,那么您可以简单地定义 'keys' 和 'LicenseDB' (n:1) 之间的关系,将列 licenseDbID 添加到 table 'keys' 中,将许多键关联到table '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();

     }

在这种情况下,table LicenseDB 中插入了两个值,即公司名称和软件名称的值。

希望对你有所帮助。

我参考了我以前的学校项目,并设法将我的列表框数据保存到 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 命令存储为数据库中的存储过程,并在我的代码中调用该命令。