簡體   English   中英

從一張表插入到另一張表

[英]Insert from one table into another

我正在使用SQL數據庫在C# 中創建一個項目,我需要從一個表(書籍)中獲取數據並將其放入另一個表(用戶)中。

我正在嘗試創建的函數稱為“LoanBooks”,到目前為止,我設法通過復制 Name 列在用戶中創建了一條新記錄,但AND (SELECT Username from dbo.Users WHERE Username like('%" + text + "%'))是我從代碼中刪除了這部分: AND (SELECT Username from dbo.Users WHERE Username like('%" + text + "%'))

我想要做的是通過文本框提供特定的“用戶名”和“名稱”,將“名稱”列從“書籍”復制到“用戶”。

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);
    }
}

我不太確定問題是什么,所以我會盡量以最好的方式解釋它。 如果您能夠提供您的表結構是什么樣的,那將會有所幫助。 如果我正確理解了這個問題,您希望 LoanBook 函數更新用戶表。 雖然這是完全可行的,但我強烈建議您閱讀第三范式。 ( 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 表。 用戶表將只有 Silviu 的單個記錄,而 Books 將為特定書籍創建單個記錄。 Cross Reference 表將包含所有已借出書籍的記錄。

表用戶


UserId(PrimaryKey) FirstName MiddleName LastName

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

從那里您只需要將用戶 ID 傳遞到已簽出的書的交叉引用表中。

因此,查看代碼的第一部分,我看到您有兩個名為 User 的類,唯一的區別是 aName。 擁有一個類是否更有意義,並且任何時候您想在不傳遞 aName 的情況下調用它,您只需傳遞 null 或默認值?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM