从一张桌子插入到另一张桌子

时间:2020-01-11 23:11:17

标签: c# sql-server

我正在使用 SQL 数据库在 C#中创建一个项目,我需要从一个表(Books)中获取数据,然后将其放入另一个表(Users)中。

我正在尝试使之成为“ LoanBooks”的函数,到目前为止,我成功通过复制“名称”列在“用户”中创建了一条新记录,但是仅当我从代码中删除此部分时:AND (SELECT Username from dbo.Users WHERE Username like('%" + text + "%')) < / p>

我想做的是通过在文本框中输入特定的“用户名”和“名称”,将“名称”列从“书籍”复制到“用户”。

class User
{
    SqlConnection con;
    SqlCommand cmd;
    SqlDataAdapter adpt;
    DataTable dt;
    string Username;
    string Password;
    string Name;
    public User(String aUser, String aPassword)
    {
        Username = aUser;
        Password = aPassword;
        con = new SqlConnection(@"Data Source=SILVIU-ASUS-N55;Initial Catalog=BooksDB;Integrated Security=True;Pooling=False");
    }
    public User(String aUser, String aPassword,string aName)
    {
        Username = aUser;
        Password = aPassword;
        Name = aName;
        con = new SqlConnection(@"Data Source=SILVIU-ASUS-N55;Initial Catalog=BooksDB;Integrated Security=True;Pooling=False");
    }
    public void SaveUser()
    {
        con.Open();
        cmd = new SqlCommand("INSERT INTO dbo.Users(Username,Password)  VALUES('" + Username + "','" + Password + "')", con);
        cmd.ExecuteNonQuery();
        con.Close();
    }
    public void DeleteUser(string Username)
    {
        con.Open();
        cmd = new SqlCommand("DELETE FROM dbo.Users WHERE Username = '" + Username + "'", con);
        cmd.ExecuteNonQuery();
        con.Close();
    }
    public void ShowUsers(DataGridView data)
    {
        adpt = new SqlDataAdapter("Select * from Users", con);
        dt = new DataTable();
        adpt.Fill(dt);
        data.DataSource = dt;
    }
    public void ShowLoanUsers(DataGridView data)
    {
        adpt = new SqlDataAdapter("Select Username,Name from Users", con);
        dt = new DataTable();
        adpt.Fill(dt);
        data.DataSource = dt;
    }
    public void SearchUser(DataGridView data, string text)
    {
        try
        {
            adpt = new SqlDataAdapter("Select * from Users where Username like('%" + text + "%')", con);
            dt = new DataTable();
            adpt.Fill(dt);
            data.DataSource = dt;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    public void SearchLoanUser(DataGridView data, string text)
    {
        try
        {
            adpt = new SqlDataAdapter("Select Username,Name from Users where Username like('%" + text + "%')", con);
            dt = new DataTable();
            adpt.Fill(dt);
            data.DataSource = dt;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    public void LoanBook(string text,string text1)
    {

        con.Open();
        cmd = new SqlCommand("INSERT INTO dbo.Users (Name) SELECT Name FROM dbo.Books WHERE Name like('%" + text1 + "%'), AND (SELECT Username from dbo.Users WHERE Username like('%" + text + "%'))", con);
        cmd.ExecuteNonQuery();
        con.Close();
    }
}

这是主要内容:

public partial class frmUser : Form
{
    User temp;
    Books temp1;
    public frmUser()
    {
        InitializeComponent();
        temp = new User("", "", "");
        temp1 = new Books("", "", "", 0);
    }
    private void btnBack_Click(object sender, EventArgs e)
    {
        frmLogin f = new frmLogin();
        this.Hide();
        f.ShowDialog();
        this.Close();
    }

    private void btnExit_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnLoanBook_Click(object sender, EventArgs e)
    {
        temp.LoanBook(txtUsername.Text, txtBookName.Text);
    }

    private void btnSearchBook_Click(object sender, EventArgs e)
    {
        temp1.SearchBook(dgvBooks, txtSearchBook.Text);
    }
    private void btnSearchUser_Click(object sender, EventArgs e)
    {
        temp.SearchLoanUser(dgvUsers, txtSearchUser.Text);
    }

    private void btnShowUsers_Click(object sender, EventArgs e)
    {
        temp.ShowLoanUsers(dgvUsers);
    }

    private void btnShowBooks_Click_1(object sender, EventArgs e)
    {
        temp1.ShowBooks(dgvBooks);
    }
}

2 个答案:

答案 0 :(得分:0)

我不确定问题到底是什么,因此我将尽我所能尽力解释它。如果您能够提供表结构的外观,则将有所帮助。如果我正确理解了这个问题,则希望LoanBook函数更新users表。虽然这是完全可行的,但我强烈建议您以第三范式进行一些阅读。 (https://en.wikipedia.org/wiki/Third_normal_form)对于任何关系数据库(SQL,Oracle等),您的目标是保持重复数据的数量有限。现在,通过该示例,如果用户签出多本书,会发生什么?我想这是您想要发生的事情,但请考虑要重复的所有数据。

表格用户


名字,中间名,姓氏,BookCheckedout等,等等,

Silviu     A           Szabo     Green Eggs and Ham
Silviu     A           Szabo     Go Dog Go
Silviu     A           Szabo     How the Grinch Stole Christmas

所以这看起来似乎很好的原因是,您正在重复前3列(Silviu A Szabu),​​并且占用了数据库中不必要的空间或良好实践。更好的选择是制作一个交叉引用表。 Users表,Books表,以及UsersBooks表或LoanedBooks表。 Users表仅具有Silviu的一条记录,而Books将为特定书籍创建一条记录。交叉引用表将包含已签出书籍的所有记录。

表格用户


UserId(PrimaryKey)名中间名姓

1              Silviu     A           Szabo     
2              Stephen    A           S    
3              Darth      A           Vader     

餐桌书


BookId(PrimaryKey)书

1                 Green Eggs and Ham
2                 Go Dog Go
3                 How the Grinch Stole Christmas

表Users_Books_XRef


UserId(ForeignKey)BooksId(ForeignKey)

1                1
1                2
1                3

从那里,您只需要将userid传递到已签出的书的crossref表中。

答案 1 :(得分:-1)

因此,查看代码的第一部分,我发现您有两个名为User的类,唯一的区别是aName。拥有一个类,是否在任何时候要调用它而不传递aName,而您只是传递null或默认值,是否更有意义?